“不管是不是我应该或需要做的是一个单独的讨论:)”
请记住这一点。
但是可以这样做 - 当一个类被实例化时,不仅语法就像 一个方法调用 - 类对象名称跟在ya括号 - 类本身(它是一个Python对象),被调用 - 作为可调用的对象。
在Python中调用对象时会在其类中调用__call__
魔法方法。因此,实例化一个类,在其元类上调用__call__
方法。
什么是标准的元类此__call__
方法(这是“型”)的内部大致相当于:
def __call__(cls, *args, **kw):
self = cls.__new__(cls, *args, **kw)
cls.__init__(self, *args, **kw)
return self
所以,如果你写一个元类,覆盖__call__
和抑制调用__init__
这些,也不会在所有被称为:
class Meta(type):
def __call__(cls, *args, **kw):
return cls.__new__(cls, *args, **kw)
class NoInit(object):
__metaclass__ = Meta
def __init__(self):
print "Hello!"
NoInit()
如果你只想避免sublcasses有__init__
而不是不调用它,你可以做一个简单得多的元类是只想RAIS e类实例化时的例外情况:
class Meta(type):
def __new__(metacls, name, bases, dct):
if "__init__" in dct:
raise NameError("Classes in this hierarchy should not have an __init__ method")
return type.__new__(metacls, name, bases, dct)
添加注释:“不要覆盖'__init__'方法”。相信你的用户。另外,聪明的用户会知道如何使用'super' – JBernardo 2012-02-08 03:19:42
我没有看到'__init__'需要f ***,这个类可以简单地跟踪'state_entry()'是否被调用并拒绝执行在此之前的任何事 – wim 2012-02-08 03:21:21
这些建议很有帮助,但我很好奇这是否可以在技术上完成。不管我是否应该这样做,都是一个单独的讨论:) – 2012-02-08 03:27:57