Python 如何在没有类继承的情况下扩展实例

Python 如何在没有类继承的情况下扩展实例,python,Python,MyClass及其实例在myModule.py中定义: class MyClass(object): pass obj = MyClass() 将功能定义为obj的方法: from myModule import obj def function(msg): print msg 如何使用函数作为方法扩展MyClass实例? 单向: obj.function = function 但这与在类定义中定义不同,例如: class MyClass(object): de

MyClass
及其实例在
myModule.py
中定义:

class MyClass(object):
    pass

obj = MyClass()
功能定义为
obj
的方法:

from myModule import obj
def function(msg):
    print msg 
如何使用
函数作为方法扩展
MyClass
实例? 单向:

obj.function = function
但这与在类定义中定义不同,例如:

class MyClass(object):
    def __init__(self): 
        self.value = 'Value'

    def function(self, msg):
        print msg, self.value

函数
定义为
MyClass
方法后,它可以访问类的属性,例如
self.value

我不知道您为什么要重复这个问题,因为它提供了不涉及子类化的解决方案

在MyClass定义中定义函数()时,它可以访问类的属性或变量,如self.value

我在你的另一篇文章中进一步阐述了我的答案,以证明这是可能的:

from unittest import mock

# This class would be defined in some third-party library
class MyClass:
    def __init__(self):
        self._private_property = 'foo'

    def method(self, msg):
        print('from method:', msg)


def function(self, msg):
    print('Accessing private property from function:', self._private_property)
    print('from function:', msg)


old_method = MyClass.method


def new_method(self, msg):
    old_method(self, msg)
    function(self, msg)


# The patch is only applied within this scope
with mock.patch.object(MyClass, 'method', new_method):
    foo = MyClass()
    foo.method('message with patched')

# By this point MyClass is "back to normal"
print('---')
foo.method('message with original')
输出

from方法:带有补丁的消息
从函数foo访问私有属性
来自函数:带有补丁的消息
---
from方法:原始消息

为什么无法扩展
MyClass
?您不能定义一个扩展
MyClass
的新类吗?您可以从实例的
\uuuu class\uuuuu
属性获取实例的类。这意味着您可以将其用作自己子类的基类。i、 e.
类MyClass(实例):
。对不起,我不够清楚。我根本无法访问这里的类定义。我只得到类实例。但请不要删除您的答案,因为它仍然是一个有价值的资源,而且非常接近主题。@字母数字您可以将字符串传递给
mock.patch.object
,例如使用mock.patch.object('somemodule.MyClass','method',new_method')
。看见
class MyClass(object):
    def __init__(self): 
        self.value = 'value'

def function(self, msg):
    print 'msg:', msg, 'value:', self.value 

foo = MyClass()
foo.function = function.__get__(foo)
foo.function(msg = 'hello world')