理解python中的元类
我试图学习python中的理解python中的元类,python,python-3.6,metaclass,Python,Python 3.6,Metaclass,我试图学习python中的元类,从我的研究中,我发现了如下示例 {'__module__': '__main__', '__qualname__': 'Base', 'foo': <function Base.foo at 0x7ffbaae436a8>} {'__module__': '__main__', '__qualname__': 'Derived', 'bar': <function Derived.bar at 0x7ffbaae437b8>}
元类
,从我的研究中,我发现了如下示例
{'__module__': '__main__', '__qualname__': 'Base', 'foo': <function
Base.foo at 0x7ffbaae436a8>}
{'__module__': '__main__', '__qualname__': 'Derived', 'bar': <function
Derived.bar at 0x7ffbaae437b8>}
def __new__(cls, name, bases, body):
if name !="Base" and not "bar" in body:
raise TypeError("bar not implemented")
return super().__new__(cls, name, bases, body)
我有一个基本类
和派生类
如下
class Base():
def foo(self):
return self.bar()
class Derived(Base):
def foo2(self):
return "i am foo2"
现在,当我想确保任何扩展Base
类的人都必须实现bar()
方法时,所以我创建了一个元类来钩住派生类的构造,所以现在Base
类看起来像下面的BaseMeta
元类
class BaseMeta(type):
def __new__(cls, name, bases, body):
if not "bar" in body:
raise TypeError("bar not implemented")
return super().__new__(cls, name, bases, body)
class Base(metaclass=BaseMeta):
def foo(self):
return self.bar()
问题是,当我查看body时,它返回了Base
和Derived
类的2条记录,如下所示
{'__module__': '__main__', '__qualname__': 'Base', 'foo': <function
Base.foo at 0x7ffbaae436a8>}
{'__module__': '__main__', '__qualname__': 'Derived', 'bar': <function
Derived.bar at 0x7ffbaae437b8>}
def __new__(cls, name, bases, body):
if name !="Base" and not "bar" in body:
raise TypeError("bar not implemented")
return super().__new__(cls, name, bases, body)
我正在检查名称!=在我的\uu新方法中的Base
这是正确的方法还是我们可以用其他最好的方法
您可以使用stdlib中的abc
模块,该模块有相应的工具。
另一种策略是在基类上有一个引发NotImplementedError的bar
方法。主要区别在于,在实际调用需要bar
的内容之前,不会引发错误。e、 g
class Base():
def foo(self):
return self.bar()
def bar(self):
raise NotImplementedError
您可以使用stdlib中的abc
模块,该模块有相应的工具。
另一种策略是在基类上有一个引发NotImplementedError的bar
方法。主要区别在于,在实际调用需要bar
的内容之前,不会引发错误。e、 g
class Base():
def foo(self):
return self.bar()
def bar(self):
raise NotImplementedError
仅供参考,你说的不是元类而是基类。有一个非常具体的含义,指的是完全不同的东西。我们也可以使用元类
来实现这个权利?理论上,我确信。但是元类的目的是实现一些不同的东西,称为类变更。很抱歉,我说得这么模糊,但我自己也不太明白它们的用途,我只是相信我链接的问题中投票数最高的答案,上面说了这一点,然后忽略了元类的存在。这看起来很有趣,如果我误解了你的问题,我会试着看一看,然后再回来。注意,你可以在不定义元类的情况下实现验证关于孩子的断言。仅供参考,你说的不是元类,而是基类。有一个非常具体的含义,指的是完全不同的东西。我们也可以使用元类
来实现这个权利?理论上,我确信。但是元类的目的是实现一些不同的东西,称为类变更。很抱歉,我说得这么模糊,但我自己也不太明白它们的用途,我只是相信我链接的问题中投票数最高的答案,上面说了这一点,然后忽略了元类的存在。这看起来很有趣,如果我误解了你的问题,我会试着看一看,然后再回来。请注意,你可以在不定义元类的情况下实现以验证关于子类的断言。我想在我的基本类中为派生的类强制执行约束,而不实现bar
方法,我对示例1感到困惑,我认为它强制执行foo
对吗?但是我需要强制执行bar()
要强制执行派生类的bar
,请在基类上为该方法声明一个抽象方法。编辑的响应反映了这一点。我想对派生的
类强制执行约束,而不在我的Base
类中实现bar
方法,我对示例1感到困惑,我想它强制执行foo
对吗?但是我需要强制执行bar()
要强制执行派生类的bar
,请在基类上为该方法声明一个抽象方法。编辑回应以反映这一点。