python 元类编程

元类:控制类行为的类

一个类定义了类实例(对象)的行为,一个元类定义了一个类的行为。

python提倡任何东西皆为对象,因此类可以看作是元类的实例。

一个类的行为可以借助一个函数来改变,那为什么要用元类呢?

原因1、语义更清晰明确。当你读SingletonMetaclass(type)时一眼便看出其意义之所在;

原因2、可以方便使用OOP编程思想。元类可以继承元类,可以扩展元类的方法,因此容易实现继承和多态等特性;

原因3、使得代码easier to read。可以更好的结构化代码;

原因4、容易下钩子。可以在魔术方法__new____init__ 和__call__里面植入钩子,干一些微妙的事情。

The main use case for a metaclass is creating an API.

常见的使用情况是实现单例模式。

class Singleton(type):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.__instance = None
        
    def __call__(self, *args, **kwargs):
        if self.__instance is None:
            self.__instance = super().__call__(*args, **kwargs)
            return self.__instance
        
        else:
            return self.__instance
        
class Spam(metaclass=Singleton):
    def __init__(self):
        print("Creating a single Spam")
        
if __name__ == "__main__":
    a = Spam()
    b = Spam()
    c = Spam()
    a is b
    a is c

#output
a = Spam()
Creating a single Spam

b = Spam()

c = Spam()

a is b
Out[5]: True

a is c
Out[6]: True

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值