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')