我应该使用元类,类装饰器还是覆盖__new__方法?

6 python inheritance metaclass

这是我的问题.我希望以下类具有一堆属性属性.我可以要么它们全部写出来像foobar,或基于我已经看到了一些其他的例子,它看起来像我可以用一个类的装饰,元类,或者重写__new__,自动将设置属性的方法.我只是不确定"正确"的做法是什么.

class Test(object):
    def calculate_attr(self, attr):
        # do calculaty stuff
        return attr

    @property
    def foo(self):
        return self.calculate_attr('foo')

    @property
    def bar(self):
        return self.calculate_attr('bar')
Run Code Online (Sandbox Code Playgroud)

Mik*_*ham 5

魔术是坏的。它使您的代码更难以理解和维护。实际上,您根本不需要元类或__new__

看来您的用例可以用非常简单的代码来实现(只有一点点魔术):

class Test(object):
    def calculate_attr(self, attr):
        return something

    def __getattr__(self, name):
        return self.calculate_attr(name)
Run Code Online (Sandbox Code Playgroud)

  • @你几乎从来不需要元类或“__new__”:我强烈不同意。在我的公司,我们已经有过两次使用元类的良好动机。首先是为我们使用的自定义数据库创建抽象层,另一个是为 ldap 创建我们自己的模型系统。我真的不明白,这种对元类的不满从何而来。这是一个容易掌握的概念,并且在某些情况下非常有用。 (2认同)
  • @gruszczy,元类并不难理解,它们实际上是一个非常简单的想法,尽管它们在 Python 中的语法和用法让一些人遇到了麻烦。然而,由于它们的传播方式,它们很容易出错,有时难以组合——让一个类在其构造中使用两个元类并不是自动可能的,即使这是一个完全合理的操作。由于元类通常不作为系统公共 API 的一部分公开,这一事实加剧了这个问题。 (2认同)