python中魔法方法

python中魔法方法

1、__del__方法

销毁魔术方法
触发时机:当一个对象在内存中被清理的时候自动执行
参数:至少有一个self,接收对象
返回值:无
作用:在对象清理的时候做一些操作
注意:程序自动调用此方法,不需要我们手动调用。

class Person(object):

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

    def __del__(self):
        print('销毁了')


person = Person()
person1 = person
print('程序结束了')

输出为:

init
程序结束了
销毁了

如上代码所示,当程序运行结束时,没有再引用的变量时,__del__会生效,所以它不是像我们预想的那样,调用这个对象时__del__就生效,所以 不会输出

2、__call__方法

call():当给对象加括号时候,自定触发的函数
进一步模糊了函数和对象之间的概念。
使用方式:对象后面加括号,触发执行。即:对象() 或者 类()()

class Foo:

    def __init__(self):
        pass
    # 当给对象加括号时候,自定触发的函数
    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 __init__,将Foo内存地址赋值给了obj
obj()  # 内存地址加括号就是调用

输出为:

__call__

如上代码所示,调用__call__时,并不需要Foo.call。因为在obj=Foo()时,就已经将Foo()的内存地址赋值给了obj,所以后面调用时obj本身就代表了那个内存地址,当成函数使用obj()

3、__str__方法

触发时机:打印对象会自定触发的函数,方法
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作

class People:
    school = 'SH'

    # 1. 打印对象会自定触发的函数,方法
    # 2. 返回值必须是字符串类型
    def __str__(self):
        return self.school


stu = People()
print(stu)

输出为:

SH

python中 使用print()函数输出对象名称的时候默认情况下,会打印对象名引用的内存地址,如果希望打印对象的属性值,可以使用__str__(self)这个方法。

4、__new__方法

实例化魔术方法
触发时机: 在实例化对时触发
参数:至少一个cls接收当前类
返回值:必须返回一个对象实例
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
没事别碰这个魔术方法,先触发__new__才会触发__init__

class Person(object):

    # 初始化
    def __init__(self):
        print('init...')

    # 实例化方法(构造方法)---》创建对象
    def __new__(cls, *args, **kwargs):
        print('new...')
        ret = super().__new__(cls) # 调用父类的__new__()方法创建对象,并用接收返回值
        return ret # 将对象返回给person

输出为:

new...
init...
<__main__.Person object at 0x0000012173217B80>

如上代码所示,要先创建一个对象,才能初始化,所以输出是先输出new…,才输出init…

5、getattrsetattr、__delattr__函数

getattr:对象.属性,当属性不存在,会自动触发__getattr__方法

setattr:给不存在属性赋值的时候执行,会自动触发__setattr__方法

delattr:当删除属性的时候还行,**会自动触发__delattr__方法

    class Foo:
        x = 1

        def __init__(self, y):
            self.y = y

        # 当访问一个不存在的属性时候,会自定触发
        def __getattr__(self, item):
            print('----> from getattr:你找的属性不存在')

        def __setattr__(self, key, value):
            print('----> from setattr')
            # print(key)
            # print(value)
            # self.key = value  # 这就无限递归了,你好好想想
            self.__dict__[key] = value  # 应该使用它

        def __delattr__(self, item):
            print('----> from delattr')
            # del self.item #无限递归了
            self.__dict__.pop(item)

    obj = Foo(10)
    obj.z = 10
    print(obj.a)  # 不存在的属性

输出为:

----> from setattr
----> from setattr
----> from getattr:你找的属性不存在
None
上一篇:.Net程序员学用Oracle系列(9):系统函数(上)


下一篇:[Jenkins]持续集成环境下fingbug插件的安装使用与配置