python常用的魔法函数

__new__与__init__

__new__在实例创建之前被调用的,就是创建实例后返回该实例对象,是个静态方法。
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。

class Foo(object):
    def __init__(self):
        print('init')

    def __new__(cls, *args, **kwargs):
        print('new')
        return object.__new__(cls)
        #__new__ 没有返回实例对象,则__init__ 不会被调用。

开发模式:单例
确保一个类只有一个实例
应用场景:
client--->访问AppConfig()类读取配置文件信息
很多地方同时调用就会实例多个浪费server资源
单例模式就可以解决!

class Singleton(object):
    __instance=None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance=object.__new__(cls)
        return cls.__instance

初始化类属性时,私有化属性只能类自身调用

class Foo(object):
    def __init__(self,x,y):
        self.x=x
        self.__y=y
f=Foo(1,2)
# print(f.x,f.y) 不能直接调用私有化属性

方法1:

class Foo(object):
    def __init__(self,x,y):
        self.x=x
        self.__y=y

    def __new__(cls, *args, **kwargs):
        print('new')
        return object.__new__(cls)

    def getY(self):
        return self.__y

    def setY(self,y):
        self.__y=y
f=Foo(1,2)
f.x=3
f.setY(4)
print(f.x,f.getY())

方法2:

class Foo(object):
    def __init__(self,x,y):
        self.x=x
        self.__y=y

    def __new__(cls, *args, **kwargs):
        print('new')
        return object.__new__(cls)

    @property
    def y(self):
        return self.__y
    @y.setter
    def y(self,y):
        self.__y=y

f=Foo(1,2)
f.x=3
f.y=4
print(f.x,f.y)

__str__

返回一个字符串,当做这个对象的描写
当调用print时打印使用

class Foo:
    def __str__(self):
        return 'describe'

f=Foo()
print(f)

__call__

将类的对象当作函数直接调用

class Foo:
    def __call__(self, *args, **kwargs):
        print('call method')

f=Foo()
f()

__enter__和__exit__

class Foo:

    def open(self):
        print('open')

    def do(self):
        print('do')

    def close(self):
        print('close')

    def __enter__(self):
        self.open()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

f=Foo()
with f:
    f.do()

__getattr__和__setattr__

__getattr__访问一个不存在的属性时会调用此方法,如果属性存在则不会调用。
__setattr__所有的属性设置都会调用此方法,并且只有拥有这个魔法方法的对象才可以设置属性

class Foo:
    def __init__(self,x):
        self.x=x

    def __getattr__(self, item):
        return item

    def __setattr__(self, key, value):
        print('set')
        object.__setattr__(self, key, value)

f=Foo(3)
f.x=4
print(f.x)
print(f.y)
posted @ 2020-08-09 13:43  leemamas  阅读(129)  评论(0编辑  收藏  举报