是否可以创建具有以下属性的python对象:
class Foo:
def __default_method__(x):
return x
f = Foo()
f(10)
> 10
也就是说,一个实例化的对象允许在不需要显式方法名的情况下调用方法?
答案 0 :(得分:7)
是。它被称为__call__()
。
答案 1 :(得分:3)
凯文在答案中指出,__call__
正是你要找的。
事实上,每次创建一个类对象时,你都在使用一个可调用类(类的元类)而没有意识到它。
通常我们这样开课:
class C(object):
a = 1
但你也可以用这种方式上课:
C = type('C',(object,),{'a':1})
type
类是所有Python类的元类。类C
是 type
的实例。现在,当您使用C
实例化C()
类型的对象时,实际上正在调用 type
类。
您可以通过将type
替换为您自己的元类来实现此操作:
class MyMeta(type):
def __call__(self):
print("MyMeta has been called!")
super().__call__()
class C(object, metaclass = MyMeta):
pass
c = C() # C() is a CALL to the class of C, which is MyMeta
> My Meta has been called!