如何从类外将atrributes添加到类方法



这将是我在这个网站上的第一个问题。如果我在英语方面犯了错误,对不起。好的,我的问题是如何从类外向类方法添加或设置属性?

如果我没有错的话,我们使用setttr((来做这件事。你们能帮我吗?

class sss():
def __init__(self,name,surname):
self.name = name
self.surname = surname
def method1(self):
a = "Python"

当我们这样做时:

object = sss("Adam","Roger") #This 2 lines are on outside the class
setattr(object,"Age",19)

到底发生了什么?现在这个";年龄;属性属于我们的对象?";年龄;属性?我的意思是,这是阶级属性还是什么?

我的第二个问题是如何将属性添加到类方法中?

谢谢

如果你用例如person = Sss("Adam", "Roger")来初始化你的类,你可以用这样的点来访问和添加属性:

person.age = 19

完整示例:

class Sss:
# You should name your class with capital letter and without brackets
def __init__(self, name, surname):
self.name = name
self.surname = surname

person = Sss("Adam", "Roger")
print(person.name) # access attribute
person.age = 19 # add attribute
print(person.age)

正如@Julian Fock所提到的,您可以通过简单地编写语句(如person.age = 19(来向对象添加属性。sss-Person类的实例/对象现在将具有此属性,但不具有类本身。

要修改类sss-Person本身,您需要实现一些丑陋的方法,这些方法将被标记为";"黑客";或";不良做法";大多数程序员。公司可以拒绝接受该准则的有效性。相反,您应该考虑使用其他方法,如class inheritance,在那里您可以派生一个添加更高级功能的修改类。

尽管如此,更改class定义对于调试或异常紧急情况可能很有用。在这种情况下,您可以定义外部函数,并将它们链接以覆盖您的类方法,如下所示:

# A) Initial Analysis
class Person:
def __init__(self,name,surname):
self.name    = name
self.surname = surname
def method1(self):
a = "Python"
person1 = Person("Adam","Roger")
person2 = Person("Adam","Roger")
person1.age = 19
print(person1.age)
# Output: 19
# print(person2.age)
# AttributeError: 'Person' object has no attribute 'age'
# B) Change class attributes
def __init2__(self, name, surname, age):
self.name    = name
self.surname = surname
self.age     = age
Person.__init__ = __init2__
person3 = Person("Adam","Roger", 20)
print(person3.age)
# Output: 20
# person4 = Person("Adam","Roger")
# TypeError: __init2__() missing 1 required positional argument: 'age'

# C) Overwrite method1
def method2(self):
self.a = "Python"
Person.method1 = method2
person5 = Person("Adam","Roger",44)
person5.method1()
print(person5.a)
# Output: "Python"

什么是"年龄;属性?我的意思是,这是阶级属性还是什么?

Age现在是名为objectsss实例上的实例变量。

如何向类方法添加属性?

我不确定你在这里要什么。

PS:我不会讨论是否建议做我将在这里举例说明的事情的优点。

添加到Bill Lynch的答案

什么是"年龄;属性?我的意思是,这是阶级属性还是什么?

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

如果您想用新方法覆盖方法1:

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)

如果您想更改方法1中的代码,请首先使用以下行获取源代码

method1_src = inspect.getsource(sss_obj.method1)

然后根据需要更改字符串,并执行前面提到的类似操作(编译等(。

干杯

相关内容

  • 没有找到相关文章

最新更新