【发布时间】:2017-06-12 14:23:13
【问题描述】:
问题在最后
我想做的是:
- 将属性注入创建的对象并设置它而不是变量(成功)
- 向创建的对象注入方法(我们称之为METHOD),对象之前没有这种方法(成功)
- 使用 self 从属性调用 public 另一个方法(成功)
- 使用 self 从属性调用 METHOD(成功)
- 使用 self 从 METHOD 获取私有类变量(失败)
现在,这里有一些代码:
from types import MethodType
def add_property(instance, name, method):
cls = type(instance)
cls = type(cls.__name__, (cls,), {})
cls.__perinstance = True
instance.__class__ = cls
setattr(cls, name, property(method))
def add_variable(instance, name, init_value = 0 ):
setattr(type(instance), name, init_value)
class Simulation:
def __init__(self):
self.finished = False
self.__hidden = -10
def someloop(self):
while not self.finished:
self.__private_method()
def __private_method(self):
pass
def public_method(self):
pass
def mocked_method(self):
print(type(self))
print(self.__dict__)
print(self.__hidden)
def finished(self):
print("Execute finished",type(self))
self.public_method()
self.mocked_update()
return True
simulation = Simulation()
add_property(simulation, "finished", finished)
add_variable(simulation, "count_finished", 0)
simulation.mocked_update = MethodType(mocked_method, simulation)
simulation.someloop()
产生了什么代码(那些打印):
Execute finished '<class '__main__.Simulation'>
<class '__main__.Simulation'>
{'finished': False, '_Simulation__hidden': -10, 'mocked_update': <bound method mocked_method of <__main__.Simulation object at 0x030D2F10>>}
(...)
AttributeError: 'Simulation' object has no attribute '__hidden'
如您所见,self 就是它应该的样子(模拟类),它被正确注入,但它不起作用。 如果您想知道:
print(self._Simulation__hidden)
显然可以在 mocked_update 中工作。
因此我的问题是:我有机会使用 self 访问这个变量吗?
动机
由于cmets部分有问题:
这没有任何实际用途,只是一个实验。
【问题讨论】:
-
我不明白。我们可以假设您拥有私有方法的名称吗?你到底想做什么,为什么
self._Simulation_hidden不适合你? -
@juanpa.arrivillaga 只是一个实验,它没有真正的目的。我只是好奇这是否可以实现。
-
抱歉,现在我明白你要做什么了。对不起,我很困惑。
标签: python python-3.x