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

        

你可能感兴趣的:(python)