python元类可以继承吗?
Can python metaclasses inherit?
classes可以继承..
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)
meta classes 也可以做类似的事情吗?
我有一个要求,我的一些 classes 必须既是抽象基础 classes 又是我自己的元 classes(比如单例类型..)
是否可以
class Singleton(type):
'''
implementation goes here..
'''
class AbstractSingleton(Singleton,ABCMeta):
'''
What code should go here??
'''
如果可能如何实现 AbstractSingleton class?
是的,有可能。
但首先要做的是:
您不应该 使用元classes 在Python 中创建单例。
单例是一个简单的概念,只需一个自定义 __new__
方法就足够了 - 不需要 metaclass。
这个简单的 4 行 normal class 代码可以用作 mixin,并将任何派生的 classes 变成 "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
现在,如果您有另一个元class的真实案例并且需要将其与 ABCMeta 或其他元class结合起来,您所要做的就是创建一个第三个 metaclass 继承自两个 metaclasses - 如果它们都以良好的方式使用 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):
...
纯属巧合,本周早些时候我恰好使用了 这个 用例作为 Python 中的 "meta meta class" 可以实现的示例。通过对 metaclass 有一个特殊的 "meta meta class" 一个想要组合到另一个(我什至在示例中使用 ABCMeta),它可以创建派生的组合 metaclass 只需使用运算符“+”,如
class SingletonMeta(type, metaclass=MM):
...
class AbstractSingletonBase(metaclass=SingletonMeta + abc.ABCMeta):
# code here.
Check the answer here.
classes可以继承..
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)
meta classes 也可以做类似的事情吗?
我有一个要求,我的一些 classes 必须既是抽象基础 classes 又是我自己的元 classes(比如单例类型..)
是否可以
class Singleton(type):
'''
implementation goes here..
'''
class AbstractSingleton(Singleton,ABCMeta):
'''
What code should go here??
'''
如果可能如何实现 AbstractSingleton class?
是的,有可能。
但首先要做的是:
您不应该 使用元classes 在Python 中创建单例。
单例是一个简单的概念,只需一个自定义 __new__
方法就足够了 - 不需要 metaclass。
这个简单的 4 行 normal class 代码可以用作 mixin,并将任何派生的 classes 变成 "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
现在,如果您有另一个元class的真实案例并且需要将其与 ABCMeta 或其他元class结合起来,您所要做的就是创建一个第三个 metaclass 继承自两个 metaclasses - 如果它们都以良好的方式使用 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):
...
纯属巧合,本周早些时候我恰好使用了 这个 用例作为 Python 中的 "meta meta class" 可以实现的示例。通过对 metaclass 有一个特殊的 "meta meta class" 一个想要组合到另一个(我什至在示例中使用 ABCMeta),它可以创建派生的组合 metaclass 只需使用运算符“+”,如
class SingletonMeta(type, metaclass=MM):
...
class AbstractSingletonBase(metaclass=SingletonMeta + abc.ABCMeta):
# code here.
Check the answer here.