类可以继承..
class Base:
def __init__(self,name):
self.name = name
class Derived1(Base):
def __init__(self,name):
super().__init__(name)
class Derived2(Base):
def __init__(self,name):
super().__init__(name)
对元类也可以做类似的事吗?
我有一个要求,我的一些类必须既是抽象基类又是我自己的元类(比如单例类型..)
可以吗
class Singleton(type):
'''
implementation goes here..
'''
class AbstractSingleton(Singleton,ABCMeta):
'''
What code should go here??
'''
如果可能的话,如何实现AbstractSingleton类?
答案 0 :(得分:4)
是的,这是可能的。
但首先要做的事情是:
你应该不使用元类在Python中创建单例。
单身人士是一个简单的概念,只需一个自定义的__new__
方法就足够了 - 不需要一个元类。
这个简单的4行普通类代码可以用作mixin,并将任何派生类转换为" singleton" classes - 创建第一个实例后,不再创建其他实例,并且始终返回第一个实例:
class SingletonBase:
def __new__(cls, *args, **kw):
if not "instance" in cls.__dict__:
cls.instance = super().__new__(cls, *args, **kw)
return cls.instance
现在,如果您有另一个元类的真实案例并需要将其与ABCMeta或其他元类组合,那么您所要做的就是创建一个继承自两个元类的第三个元类 - 如果它们都以良好的方式使用super
,它就会起作用。
class SingletonMeta(type):
def __call__(cls, *args, **kw):
# You know - you _really_ should not be using metaclasses for singletons.
if not "instance" in cls.__dict__:
cls.instance = super().__call__(*args, **kw)
return cls.instance
class SingletonAbstractMeta(SingletonMeta, abc.ABCMeta):
pass
class SingleAbstractBase(metaclass=SingleAbstractMeta):
...
纯粹巧合的是,本周早些时候,我使用了这个用例作为使用" meta元类"可以实现的内容的一个例子。在Python中。通过一个特殊的元元课程#34;对于要在另一个上组合的元类(我甚至在示例中使用ABCMeta),它只需使用运算符"就可以创建派生的组合元类。 +",在
中class SingletonMeta(type, metaclass=MM):
...
class AbstractSingletonBase(metaclass=SingletonMeta + abc.ABCMeta):
# code here.