Skip to main content
 首页 » 编程设计

python之更改实例变量时更改另一个实例变量

2025年05月04日34bjzhanghao

每次我们对类进行变量更改时,我希望能够更改类中的变量(在本例中为 greet)。

截图是这个:

class Greet(object):                                                                                         
    def __init__(self, name="", age="", job=""): 
        self.name = name 
        self.age = age 
        self.job = job 
        self.greet = "Hello" 
 
        if self.name: 
            self.greet = self.greet + " " + self.name  
 
        if self.age: 
            self.greet = self.greet + ". Good to know that you is " + self.age + " years old" 
 
        if self.job: 
            self.greet = self.greet + ". I think being a " + self.job + " is amazing." 
 
    def shout(self): 
        print self.greet 
        return True 
 
g1 = Greet(name="John Doe", job="Programmer") 
 
g2 = Greet(name="Janis Duh", age="34", job="Singer") 
g2.name = "Janis Joplin" 
 
g3 = Greet() 
g3.name = "Smith" 
g3.age = "22" 
g3.job = "Designer" 
 
print ("Name %s\nAge %s\nJob %s\nGreet %s\n" % ( g1.name, g1.age, g1.job, g1.greet)) 
g1.shout 
 
print ("Name %s\nAge %s\nJob %s\nGreet %s\n" % ( g2.name, g2.age, g2.job, g2.greet)) 
g2.shout 
 
print ("Name %s\nAge %s\nJob %s\nGreet %s\n" % ( g3.name, g3.age, g3.job, g3.greet)) 
g3.shout 

输出是:

Name John Doe
Age
Job Programmer
Greet Hello John Doe. I think being a Programmer is amazing.

Name Janis Joplin
Age 34
Job Singer
Greet Hello Janis Duh. Good to know that you is 34 years old. I think being a Singer is amazing.

Name Smith
Age 22 Job Designer
Greet Hello

shout 方法在任何情况下都不会正确打印“问候语”。即使在正确设置 self.greet 的情况下。

g1 对象打印正常,因为我在创建实例时声明了变量。

g2 正确更改了变量名,但问候语仍然指向旧值,似乎没有更新。

g3 更糟糕的是,可能出于同样的原因,g2 没有在问候时正确更新名称。

欢迎指点

(后期编辑)

按照 Adam Smith 的说法,我宁愿尝试将“greeting”保留为实例属性,如下所示:

def greet(self): 
    self.greeting = "Hello!" 
    if self.name: 
        self.greeting += " {0.name}." 
    if self.age:                                                                                         
        self.greeting += " Good to know you are {0.age} years old." 
    if self.job: 
        self.greeting += " I think being a {0.job} is amazing." 
    print(self.greeting.format(self)) 
 
... 
 
g = Greeter(...) 
g.greet() 

有效,但是

print g.greeting 

给我这样的东西:

Hello! {0.name}. Good ... 

请您参考如下方法:

听起来您需要在函数中生成它,因此每次调用它时都会计算它。

class Greeter(object): 
    def init(self, ...): 
        ... 
 
    def greet(self): 
        greeting = "Hello!" 
        if self.name: 
            greeting += " {0.name}." 
        if self.age: 
            greeting += " Good to know you are {0.age} years old." 
        if self.job: 
            greeting += " I think being a {0.job} is amazing." 
        print(greeting.format(self))