如何从 class 外部向 class 方法添加属性?
How can i add atrributes to the class method from outside class?
这将是我在这个网站上的第一个问题。如果我对英语有误,对不起。
好的,我的问题是如何从 class 外部向 class 方法添加或设置属性?
如果我没记错的话,我们使用 settatr() 来做到这一点。你们能帮帮我吗?
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)
到底发生了什么?现在这个“Age”属性属于我们的对象了吗?现在“Age”属性的值是多少?我的意思是 class 属性还是什么?
我的第二个问题是如何向 class 方法添加属性?
谢谢
What is "Age" attribute now? I mean is that class attribute or what?
Age
现在是名为 object
.
的 sss
实例上的一个实例变量
How can i add attribute to the class method?
我不确定你在这里问什么。
如果您实例化您的 class,例如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
class 的 instance/object 现在将具有此属性,但 class 本身没有。
要修改 class sss-Person
本身,您需要实施一些丑陋的方法,大多数程序员会将其标记为“hacky”或“不良做法”。公司可以拒绝接受该代码的有效性。您应该考虑使用其他方法,例如 class inheritance
,您可以在其中派生修改后的 class 添加更多高级功能。
不过,更改 class
定义对于调试或异常紧急情况还是很有用的。在这种情况下,您可以定义外部函数,并 link 它们来覆盖您的 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"
PS.: 我不会讨论是否推荐做我将在这里举例说明的事情的优点。
添加到 Bill Lynch 的回答中
What is "Age" attribute now? I mean is that class attribute or what?
Age is now an instance variable on your instance of sss named object.
PS.: 不要使用 object
因为它是 python.
中的关键字
What is the value of the "Age" attribute now?
值为 19。
I mean is that class attribute or what?
它是您从 class 创建的实例的属性,并且仅适用于该实例。
how can I add attribute to the class method?
如果您想将属性添加到 class 以便每个实例都有您选择的新属性,您可以这样做:
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)
如果您想更改 class 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)
然后根据需要更改字符串并执行与前面提到的类似的操作(编译和填充)。
干杯
这将是我在这个网站上的第一个问题。如果我对英语有误,对不起。 好的,我的问题是如何从 class 外部向 class 方法添加或设置属性?
如果我没记错的话,我们使用 settatr() 来做到这一点。你们能帮帮我吗?
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)
到底发生了什么?现在这个“Age”属性属于我们的对象了吗?现在“Age”属性的值是多少?我的意思是 class 属性还是什么?
我的第二个问题是如何向 class 方法添加属性?
谢谢
What is "Age" attribute now? I mean is that class attribute or what?
Age
现在是名为 object
.
sss
实例上的一个实例变量
How can i add attribute to the class method?
我不确定你在这里问什么。
如果您实例化您的 class,例如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
class 的 instance/object 现在将具有此属性,但 class 本身没有。
要修改 class sss-Person
本身,您需要实施一些丑陋的方法,大多数程序员会将其标记为“hacky”或“不良做法”。公司可以拒绝接受该代码的有效性。您应该考虑使用其他方法,例如 class inheritance
,您可以在其中派生修改后的 class 添加更多高级功能。
不过,更改 class
定义对于调试或异常紧急情况还是很有用的。在这种情况下,您可以定义外部函数,并 link 它们来覆盖您的 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"
PS.: 我不会讨论是否推荐做我将在这里举例说明的事情的优点。
添加到 Bill Lynch 的回答中
What is "Age" attribute now? I mean is that class attribute or what?
Age is now an instance variable on your instance of sss named object.
PS.: 不要使用 object
因为它是 python.
What is the value of the "Age" attribute now?
值为 19。
I mean is that class attribute or what?
它是您从 class 创建的实例的属性,并且仅适用于该实例。
how can I add attribute to the class method?
如果您想将属性添加到 class 以便每个实例都有您选择的新属性,您可以这样做:
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)
如果您想更改 class 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)
然后根据需要更改字符串并执行与前面提到的类似的操作(编译和填充)。
干杯