千字长文讲解python的魔法函数、反射

1.什么是魔法函数
a.类自带的以双下划线开头和结束的方法
b.一般不需要主动调用,由特定的方法或行为触发
c.可以通过魔法函数控制类的行为,实现对类的高级控制
d.常见的魔法函数如__init__
2.__repr__:定制对象显示规则
3.__del__:定制对象的析构方法
4.__new__:负责创建类的实例
a.__new__和__init__的区别: __new__负责创建类的实例,__init__负责初始化类的实例
b.创建类的实例时,先调用__new__,再调用__init__
c.__init__初始化类的实例是由__new__方法传递过来的,也就是这里的self
d.可以用来实现类的单例模式:用类的一个属性保存已经创建的实例

class Student:
    def __new__(cls, *args, **kwargs):
        print('__new__')
        return object.__new__(cls) # 调用父类的__new__方法

    def __init__(self):
        print('__init__')


s = Student()

'''
__new__
__init__
'''
class NewInt(int):
    def __new__(cls, value):
        return int.__new__(cls, abs(value))


a = NewInt(-4.56)
print(a)

'''
4
'''

5.通过魔法函数对属性进行管理
a.__dir__():查看对象的方法和属性的名字
b.dir():一个函数,对__dir__方法返回值进行排序,并包装为列表
c.__dict__是一个字典,有如下特性
i.当作用于类时,存储所有实例共享的变量和函数,不包含实例属性
ii.当作用于对象时,存储该对象所有的属性和值(包含私有属性)
iii.一般用于动态读取和设置对象的属性

6.attr相关魔法函数
a.__getattribute__(self, xxx):访问对象的任意属性时被自动调用

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

    def __getattribute__(self, item):
        return super().__getattribute__(item)


stu = Student('zhangsan', 18)
print(stu.name)

'''
zhangsan
'''

b.getattr(self, xxx):访问对象的xxx属性且该属性不存在时被调用

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

    def __getattribute__(self, item):
        print(f'访问了 {item} 属性')
        return super().__getattribute__(item)

    def __getattr__(self, item):
        print(f'调用了 __getattr__ 方法')


stu = Student('zhangsan', 18)
print(stu.abc)

'''
访问了 abc 属性
调用了 __getattr__ 方法
None
'''

c.__setattr__(self, xxx):当对xxx属性赋值时被调用

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

    def __setattr__(self, key, value):
        self.__dict__[key] = value
        print(f'将 {key} 的值设置为 {value}')


stu = Student('zhangsan', 18)
stu.age = 20

'''
将 name 的值设置为 zhangsan
将 age 的值设置为 18
将 age 的值设置为 20
'''

d.__delattr__(self, xxx):当删除对象的xxx属性时被调用
7.反射
a.通过字符串的形式在运行时动态修改程序的变量、方法及属性的操作。注意,对于反射操作中所有的修改都会在内存中进行,所以它并不会修改实际代码。主要目的是提高代码在运行时的灵活性
b.hasattr:输入一个字符串,判断对象有没有这个方法或属性
c.getattr:获取对象属性或方法的引用。如果是方法,则返回方法的引用;如果是属性,直接返回属性值。如果属性或方法不存在,则抛出异常
d.setattr:动态添加一个方法或属性
e.delattr:动态删除一个方法或属性

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值