私有成员
什么是私有成员:
私有成员:如果在成员(属性和方法)名前面加了2个下划线'__',则表明该成员是私有成成员,否则为公有
私有成员作用:
私有成员:私有成员只能在类内被访问到
类内:写在本类内部的代码
类外:写在本类外部的代码
好处:
1.更好的保护属性安全,即不能随意修改
2.面向对象编程的思想关注的是对象功能完成的结果,不关注内部实现和过程。设计私有成员可以提高封装性,隐藏内 部实现,仅开放用户需要的功能.
语法:
class 类名:
def __init__(self):
self.__属性名称 = "属性值"
def __方法名称(self):
#方法体
例子:
# 创建一个学生类
class Student:
def __init__(self, name, age):
self.name = name
self.__age = age
# 展示个人信息
def show(self):
print(f"我的名字是{self.name},今年{self.__age}岁")
# 实例化对象
stu = Student(name="小三", age=20)
stu.show()
# 把其中一个属性修改成私有成员进行访问
# print(stu.__age) # 私有成员不能在本类外部访问
# 查看对象上所有属性
print(dir(stu))
__del__方法
1.调用时机:对象空间 被销毁时,自动调用 对象上的__del__方法
class 类名(object):
def __del__(self):
# 对象被销毁的时候自动调用执行, 清理对象占用的资源 或者 明确对象的销毁时机
pass
2.对象销毁的时机
a. 脚本执行结束, python占用的所有内存资源都被释放, 包括对象空间(python垃圾回收机制)
b. 对象的没有被任何变量引用的时候, 对象被当做垃圾回收了
手动清空对象空间:
del 对象变量
对象变量 = None
3.例子:
# 定义一个学生类
class Student:
def __init__(self):
print("创建对象成功")
def __del__(self):
print("对象被销毁")
# 创建对象
stu1 = Student()
stu2 = stu1
# del stu1
# del stu2
# 重新赋值为None也会被释放
stu1 = None
stu2 = None
print("end.......")
继承
1.概念:子类继承父类,直接使用父类上的成员(属性和方法)
语法:
class 子类名(父类名):# 默认继承 object
# 子类新增成员
pass
注意:私有成员不能被继承
2.继承的特征:
单继承
多层继承
多继承
重写
概念:子类中定义与父类相同名字的成员,即子类重写父类成员
属性重写
方法重写
方法重写:
当父类上的方法不满足子类上的需要,但子类不得不使用该方法,则在子类中重写父类方法
例子:
# 创建一个父类
class Father(object):
def __init__(self, name, age, money):
self.name = name
self.age = age
self.money = money
# 私有化身高
self.__height = 178
def show(self):
print(f"{self.name}今年{self.age},有财富{self.money},身高{self.__height}")
# 定义一个子类,继承父类
class Son(Father):
def showHeight(self):
print(self.__height) # 子类不能使用父类上的私有成员
# 创建一个子类对象
son = Son(name="大头儿子", age=10, money=50)
print(son.name) # 继承属性
son.show() # 继承方法
# 私有化没法继承
# son.showHeight()
多态(了解):继承,重写,相同的方法实现的功能不同,这就是对态
3.查看对象信息:
type(对象):查看对象类名(类型)
dir(对象):查看对象上的所有属性(属性和方法都称为属性)
isinstance(对象,类名):判断对象是否是指定类的实例(对象)
类属性和实例属性
1.实例属性:对象上的属性
绑定方式:
动态:类名.属性名=值
在类中绑定:
class 类名(object):
类属性名=值
访问:
类名.类属性名
作用:将所有对象共享的属性设置为类属性,所有对象都能使用,从而节约内存空间
例子:
class Student(object):
# 绑定类属性
class_name = "软件测试精英班"
# print(dir(Student)) # 类也是一个对象
# 动态添加属性
# Student.class_name = "软件测试精英班"
# 在类中绑定属性
print(Student.class_name) # 一般直接通过 类名.属性名 进行访问
# 创建对象访问类属性
stu = Student()
print(stu.class_name)
类方法和静态方法
class 类名(object):
# 实例方法
def 方法名(self,[形参]):
pass
# 类方法
@classmethod
def 类方法名(cls,[形参]):
# cls == class 调用的那个类
pass
# 静态方法
@staticmethod
def 静态方法名([形参]):
pass
# 调用
类名.类方法名()
类名.静态方法名()