Python默认/未命名方法

时间:2015-06-09 19:15:52

标签: python class object

是否可以创建具有以下属性的python对象:

class Foo:
  def __default_method__(x):
      return x

f = Foo()
f(10)
> 10

也就是说,一个实例化的对象允许在不需要显式方法名的情况下调用方法?

2 个答案:

答案 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!