Python默认/未命名方法

Python默认/未命名方法,python,class,object,Python,Class,Object,是否可以创建具有以下属性的python对象: class Foo: def __default_method__(x): return x f = Foo() f(10) > 10 也就是说,一个对象在实例化时允许调用一个方法,而不需要显式的方法名?是。它叫。正如凯文在回答中指出的那样,\uu call\uuuu就是你要找的 事实上,每次创建类对象时,您都在使用一个可调用类(类的元类),而没有意识到它 通常我们这样上课: class C(object): a =

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

class Foo:
  def __default_method__(x):
      return x

f = Foo()
f(10)
> 10

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

是。它叫。

正如凯文在回答中指出的那样,
\uu call\uuuu
就是你要找的

事实上,每次创建类对象时,您都在使用一个可调用类(类的元类),而没有意识到它

通常我们这样上课:

class C(object):
    a = 1
C = type('C',(object,),{'a':1})
但您也可以这样创建一个类:

class C(object):
    a = 1
C = type('C',(object,),{'a':1})
type
类是所有Python类的元类。类
C
类型的一个实例。现在,当您使用
C()
实例化
C
类型的对象时,实际上是调用
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!

在Python中,我们通常不使用术语“函子”,因为在Python中,函数是第一类的,所以函子模式是搜索问题的解决方案。相反,我们谈论的是对象是否为。