Python入门笔记—第十二章【面向对象之OOP(第六部分,类的常用魔术方法)】

类的常用魔术方法

- 魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发

- 魔术方法的统一特征,名字前后各有两个下划线,如:__init__

- 操作类:

    - __init__:构造函数

    - __new__:对象实例化方法,此函数比较特殊,一般不需要使用

    - __call__:对象当函数使用时触发

    - __str__:当对象被当做字符串使用的时候调用

    - __repr__:返回字符串,和__str__的具体区别百度?(明天接着研究,感觉水有点深度)

#操作类实例
class A():
    def __init__(self):
        print("我是构造函数")
    def __call__(self):
        print("我是对象,我被当做函数使用时被调用")
    def __str__(self):
        return "我是对象,我被当做字符串使用的时候调用"

a = A()
a()
print(a)

结果:

我是构造函数
我是对象,我被当做函数使用时被调用
我是对象,我被当做字符串使用的时候调用

- 描述符相关:(此部分后面再补)

    - __set__:

    - __get__:

    - __delete__:

- 属性操作相关:

    - __getattr__:访问一个不存在的属性时触发(代码实例1:

        - 语法:def __getattr__(self,name)

    - __setattr__:对成员属性进行设置的时候触发(代码实例2:

        - 语法:def __setattr__(self,name,value)

        - 参数:

            - self用来获取当前对象

            - 被设置的属性名称以字符串出现

            - 需要对属性名称设置的值

        - 作用:进行属性设置的时候进行验证或者修改

        - 注意:在该方法中不能对属性进行直接赋值操作,否则进入死循

代码实例1:

#__getattr__案例
class Student():
    name = "dana"
    age = 18

    def __getattr__(self,name):
        print(name)
        print("我是魔法函数__getattar__,当访问不存在的成员时会调用我,看,我被调用了")

s = Student()
print(s.name)
print(s.age)
print(s.addr)        #此处访问了类Student中不存在的成员,即自动触发函数__getattr__
#关于结果中为什么会打印出None的解释:
#魔法函数__getattr_触发的条件是访问不存在的成员时会调用,当对象s访问成员addr时的瞬间就调用了,即:
#打印出name和“我是魔法函数…………”
#然后再使用print打印出s.addr的内容,其内容为空,即打印出None

结果:

dana
18
addr
我是魔术函数__getattar__,当访问类中不存在的成员时会调用我,看,我被调用了
None

代码实例2:

#__setattr__案例
class Student():
    name = "dana"
    age = 18

    def __setattr__(self,name,value):
        #self.name = "xiaona"           #此处如果使用此语句,将会陷入死循环
        print(name+"   "+value)
        print("我是魔法函数__setattar__,当对成员属性进行设置时会调用我,看,我被调用了")

s = Student()
s.addr = "NCU" 

结果:

addr   NCU
我是魔法函数__setattar__,当对成员属性进行设置时会调用我,看,我被调用了


- 运算分类相关魔术方法

    - __gt__:进行大于判断的时候触发的函数

    - 参数:

        - self

        - 第二个参数是第二个对象

        - 返回值可以是任意只,推荐返回布尔值

代码实例3:

class Student():
    def __init__(self,name):
        self._name = name

    def __gt__(self,obj):
        print(self._name+"会比"+obj._name+"大吗?")
        return self._name > obj._name

stu1 = Student("abc")
stu2 = Student("abd")

print(stu1 > stu2)

结果:

abc会比abd大吗?
False

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章