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/

10-11 19:29