#super函数
用超类的实例简介调用父类的方法
本来子类已经可以调用父类方法,但是当子类重载了函数时,无法用子类调用父类方法,这是可以用super函数来调用
若A派生出B,亦可以用b.__class__.__base__.函数名(b)调用A类的函数
super用法:
super(class_name, b).函数名() 返回A类对象的实例,相当于将B类对象当作A类对象
super()无参调用,只能在子类的方法中使用,函数自动检测self参数,并将其当作父类对象调用父类方法
#调用父类的初始化方法
示例:
class Human():
def __init__(self, name_str, age_int):
self.name = name_str
self.age = age_int
class Student(Human):
def __init__(self, name_str, age_int, score_int):
super().__init__(name_str, age_int)
self.score = score_int
def __str__(self):
return "Student name: %s, age: %d, score: %d" % (self.name, self.age, self.score)
s = Student("xiaozhang",12,33)
print(s)
#用于类的函数:
issubclass(cls, class or tuple) 判断cls类是否继承自其他的类,若cls继承自class或者tuple中的class,返回Ture,反之返回False
#查看内建类的关系图谱:
help(__builtins__)
#封装的含义
#私有属性 hidden_property
以双下划线为开头的变量是私有属性
只能供类内的方法来访问,其子类和外部函数都不能调用
#私有方法
以双下划线为开头的方法是私有方法
只能供该类内部的方法来访问,其子类、该类的实例和外部都不能调用
#多继承
一个类继承多个类
#类的模拟属性装饰器@property
为了防止出错,不让外界直接读取与修改类的变量,应该通过函数提供接口进行修改,比如S.setAge(),S.getAge(),但是这样调用又很复杂,可以用模拟属性的getter 和 setter方法来实现
用@property装饰的函数自动生成对应模拟变量,并将所装饰函数认为是getter方法
下面如果有 @模拟变量名.setter 装饰的方法,则认为是setter方法
如果只有 @property,没有 @setter 则是只读变量
比如:
class Human():
def __init__(self, age_int, birth_int):
self.__age = age_int
self.__birth = birth_int
@property
def age(self):
return self.__age
@age.setter
def age(self, age_int):
self.__age = age_int
@property
def birth(self):
return self.__birth
h = Human(12,1998)
h.age = 100
print(h.age)
#h.birth = 2000
print(h.birth)
#其中Human中birth模拟属性只有getter,没有setter,是只读属性
#运算符重载
方法名 运算符
__add__ +
__sub__ -
__mul__ *
__truediv__ /
__floordiv__ //
__mod__ %
__pow__ **
运算符重载格式:
def __xxx__(self, other)
#示例:重载加法运算符
class MyNumber():
def __init__(self, val):
self.value = val
def __repr__(self):
return "MyNumber(%d)" % self.value
def __add__(self, other):
return MyNumber(self.value + other.value)
a1 = MyNumber(10)
a2 = MyNumber(30)
a3 = a1 + a2
print(a3)
#复合运算符重载
方法名 运算符
__iadd__ +=
__isub__ -=
__imul__ *=
__itruediv__ /
__ifloordiv__ //
__imod__ %=
__ipow__ **=
#比较运算符的重载
方法名 运算符
__lt__ <
__le__ <=
__gt__ >
__ge__ >=
__eq__ ==
__ne__ !=
#位运算符重载
方法名 运算符
__invert__ ~
__and__ &
__or__ |
__xor__ ^
__lshift__ <<
__rshift__ >>
#反向返回位运算符
上面的方法加r
#复合赋值位运算符重载
上上面加i
#一元运算符重载
方法名 运算符
__neg__ -
__pos__ +
__invert__ ~