从Programming Language Pragmatics, by Scott
“但是,在首次定义类时,方法集是固定的”是什么意思?
我似乎找到了一个反例:
>>> 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>})
最佳答案
就像问题中所示:将函数添加到行为类似于任何方法的类对象上是微不足道的:
def fake_method(self,idx):
print(self, idx)
class MyClass(object):
pass
MyClass.new_method = fake_method
n = MyClass()
n.new_method(10)
# <__main__.MyClass object at 0x000001BBA6E90860> 10
您还可以向实例添加类似于“方法”的“可调用属性”:
import types
def fake_method(self,idx):
print(self, idx)
class MyClass(object):
pass
n = MyClass()
n.new_method = types.MethodType(fake_method, n)
n.new_method(10)
# <__main__.MyClass object at 0x000001BBA6E9C2E8> 10
这里需要
types.MethodType
,因为否则它的行为类似于staticmethod
。我的总结:可能是我遗漏了报价中的某些要点,或者这是错误的。
关于python - "The set of methods, however, is fixed when the class is first defined"是真的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46056052/