理解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>}

我试图学习python中的
元类
,从我的研究中,我发现了如下示例

 {'__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
,请在基类上为该方法声明一个抽象方法。编辑回应以反映这一点。