我问这个问题是因为对这个答案的评论主题进行了讨论.我90%的方式来绕过它.
In [1]: class A(object): # class named 'A'
...: def f1(self): pass
...:
In [2]: a = A() # an instance
Run Code Online (Sandbox Code Playgroud)
f1 存在三种不同的形式:
In [3]: a.f1 # a bound method
Out[3]: <bound method a.f1 of <__main__.A object at 0x039BE870>>
In [4]: A.f1 # an unbound method
Out[4]: <unbound method A.f1>
In [5]: a.__dict__['f1'] # doesn't exist
KeyError: 'f1'
In [6]: A.__dict__['f1'] # a function
Out[6]: <function __main__.f1>
Run Code Online (Sandbox Code Playgroud)
绑定方法,未绑定方法和函数对象之间的区别是什么,所有这些都由f1描述?如何调用这三个对象?他们怎么能相互转化?关于这些东西的文档很难理解.
对于类的内容(成员),Python和Ruby都比PHP或更传统的面向对象语言更灵活.只需分配给Python对象,就可以将新字段添加到Python对象中:my_object.new_field = value.但是,在首次定义类时,这组方法是固定的.在Ruby中,只有方法在类外可见("put"和"get"方法必须用于访问字段),并且必须显式声明所有方法.但是,可以修改现有的类声明,添加或覆盖方法.甚至可以在逐个对象的基础上执行此操作.因此,同一类的两个对象可能不会显示相同的行为.
然而,"当首次定义类时,这组方法是否已修复"是什么意思?
我似乎找到了一个反例:
>>> class E:
... pass
...
>>> E.__dict__
mappingproxy({'__module__': '__main__', '__dict__': <attribute '__dict__' of 'E' objects>, '__doc__': None, '__weakref__': <attribute '__weakref__' of 'E' objects>})
>>> def myfun():
... pass
...
>>> E.mf=myfun
>>> E.__dict__
mappingproxy({'__module__': '__main__', '__dict__': <attribute '__dict__' of 'E' objects>, '__doc__': None, '__weakref__': <attribute '__weakref__' of 'E' objects>, 'mf': <function myfun at 0x7f6561daba60>})
Run Code Online (Sandbox Code Playgroud)