Python學習筆記:類、過載運算子
#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__ ~