PS.:我不会讨论是否建议做我将在这里举例说明的事情的优点。
添加到比尔林奇的答案
现在什么是“年龄”属性?我的意思是那个类属性还是什么?
Age 现在是您的 sss 命名对象实例上的一个实例变量。
PS.:不要使用object,因为它是python中的关键字。
现在“年龄”属性的值是多少?
值为 19。
我的意思是那个类属性还是什么?
它是您从类中创建的实例的属性,并且仅适用于该实例。
如何为类方法添加属性?
如果您想将属性添加到类中,以便每个实例都有您选择的新属性,您可以这样做:
setattr(sss, 'b', 'Python')
obj1 = sss("Adam", "Roger")
print(obj1.b)
obj2 = sss("Adam", "Roger")
print(obj2.b)
obj2.b = "New"
print(obj1.b) # will still be Python
print(obj2.b) # now will be New
如果你想用新方法覆盖method1:
sss_obj = sss("Adam", "Roger")
def method1(self):
self.b = 'New'
setattr(sss, 'method1', method1)
print('Should be False because the instance has no b attribute yet.', hasattr(sss_obj, 'b'))
sss_obj.method1()
print('Now it has and b value is', sss_obj.b)
如果你想更改类 sss 的特定实例的方法:
sss_obj = sss("Adam", "Roger")
sss_obj2 = sss("Adam", "Roger")
def method1():
sss_obj2.b = 'New'
setattr(sss_obj2, 'method1', method1)
sss_obj.method1()
print('Should be False because method1 from instance sss_obj does not set b.', hasattr(sss_obj, 'b'))
sss_obj2.method1()
print('Now on instance 2 the b value is', sss_obj2.b)
如果您想以编程方式将方法的来源更改为字符串:
sss_obj = sss("Adam", "Roger")
new_method_source = 'self.b = "NotRecommended"\n' \
'print("Got into changed method")'
def method1(self):
return exec(
compile(new_method_source, '', mode='exec'),
None,
{
'self': self
}
)
setattr(sss, 'method1', method1)
如果要改method1的代码,先用下面一行抓取源码
method1_src = inspect.getsource(sss_obj.method1)
然后根据需要更改字符串并执行与前面提到的类似的操作(编译和填充)。
干杯