1. 程式人生 > >Python學習筆記:類、過載運算子

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__    ~