在定义一个类时,有一些数据我们不希望被外部访问或调用,比如身份证号码或者账户余额等私人信息,就需要我们对信息进行加密,这时就用到了私有变量
所谓私有变量,就是在函数内定义时变量名前面带有双下划线的变量,这种变量不可以被外部调用:
class Dog():
def __init__(self, name):
self.__name = name
这里的__name就不能在主函数中直接print或者做修改动作
那我们怎么访问或者调用它呢?就需要在类内部创建调用它的函数以及调用规则:
def get_name(self):
return self.__name
def __set_name__(self, name):
if len(name) < 10:
self.__name = name
else:
raise ValueError('名字过长!')
这样就能用get_name得到__name的值了,set__name则可以修改name的值,并对修改时输入的值进行判断,看它是否符合规则,若不符合就会报错
父类与子类:
python中定义一个类时可以规定该类有多个父类,并从父类中继承对应的类属性和方法,这里就出现了一个问题:如果子类和父类中存在相同名字却功能不同的函数怎么办?由于正常情况下我们采用实例对象来进行函数执行,所以默认执行该实例化对象对应的类中的函数,相当于父类函数被 '重写’ 了,如果要调用被重写的父类函数,就用到super()函数
class People:
def __init__(self):
self.name = "人"
class Student(People):
def __init__(self): # 重写了父类的init方法
super().__init__() # 不调用父类的init,父类的name属性就不会被定义
self.age = 10
上面这个例子就是重新启用People类中的init()函数,将self.name = ‘人’语句在Student类中执行。
上面说到,一个子类可以有多个父类,所以在继承方法时便会存在先后问题,即在寻找同名方法时到底执行的是哪个父类的函数。可以用mro()函数来查看查找的顺序。
print(C.__mro__) #可以查看C类的对象搜索方法时的先后顺序