Python 更改实例变量时更改另一个实例变量
我希望能够在类中更改变量,在这种情况下,每当我们在类中更改变量时 被剪断的是这个:Python 更改实例变量时更改另一个实例变量,python,class,Python,Class,我希望能够在类中更改变量,在这种情况下,每当我们在类中更改变量时 被剪断的是这个: class Greet(object): def __init__(self, name="", age="", job=""): self.name = name self.age = age
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
输出为:
名字叫约翰·多伊
年龄
工作
程序员
你好,约翰·多伊。我想
作为一名程序员是令人惊奇的
名字叫贾尼斯·乔普林
34岁
职业歌手
你好,贾尼斯·杜。很高兴知道你已经34岁了。我觉得当一名歌手很了不起
史密斯
22岁
职业设计师
打招呼
在任何情况下,shout方法都不会正确打印问候语。即使在正确设置self.greet的情况下
g1对象打印ok,因为我在创建实例时声明了变量
g2正确更改了变量名,但问候语仍然指向旧值,似乎没有更新
g3甚至更糟,可能是因为同样的原因g2在问候语中没有正确更新名称
欢迎指路
后期编辑
遵循Adam Smith的提示,我尝试将问候语作为实例属性,如中所示:
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))
听起来你需要在函数中生成它,所以每次调用它时都会计算它
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))
self.greet将在_init__期间计算,并且不会再次重新计算
我最好的办法是把它变成一个财产。因此,您仍然可以使用现有的语法
def __init__(self, name="", age="", job=""):
self.name = name
self.age = age
self.job = job
@property
def greet(self):
txt = 'Hello'
if self.name:
txt += " " + self.name
if self.age:
txt += ". Good to know that you is " + self.age + " years old"
if self.job:
txt += ". I think being a " + self.job + " is amazing."
return txt
这样,每次收到问候语时都会重新计算问候语
现在执行测试代码:
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()
生成此输出:
名字叫约翰·多伊
年龄
工作程序员
你好,约翰·多伊。我认为成为一名程序员是了不起的。
你好,约翰·多伊。我认为成为一名程序员是了不起的。
名字叫贾尼斯·乔普林
34岁
职业歌手
你好,贾尼斯·乔普林。很高兴知道你已经34岁了。我觉得当一名歌手很了不起。
你好,詹妮斯·乔普林。很高兴知道你已经34岁了。我觉得当一名歌手很了不起。
史密斯
22岁
职业设计师
你好,史密斯。很高兴知道你22岁了。我认为成为一名设计师是了不起的。
你好,史密斯。很高兴知道你22岁了。我认为成为一名设计师是了不起的。
实例变量的手动打印与调用shoutself时的greet相同。greet在uu init_uu_u_u_u期间被计算,并且永远不会重新计算
我最好的办法是把它变成一个财产。因此,您仍然可以使用现有的语法
def __init__(self, name="", age="", job=""):
self.name = name
self.age = age
self.job = job
@property
def greet(self):
txt = 'Hello'
if self.name:
txt += " " + self.name
if self.age:
txt += ". Good to know that you is " + self.age + " years old"
if self.job:
txt += ". I think being a " + self.job + " is amazing."
return txt
这样,每次收到问候语时都会重新计算问候语
现在执行测试代码:
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()
生成此输出:
名字叫约翰·多伊
年龄
工作程序员
你好,约翰·多伊。我认为成为一名程序员是了不起的。
你好,约翰·多伊。我认为成为一名程序员是了不起的。
名字叫贾尼斯·乔普林
34岁
职业歌手
你好,贾尼斯·乔普林。很高兴知道你已经34岁了。我觉得当一名歌手很了不起。
你好,詹妮斯·乔普林。很高兴知道你已经34岁了。我觉得当一名歌手很了不起。
史密斯
22岁
职业设计师
你好,史密斯。很高兴知道你22岁了。我认为成为一名设计师是了不起的。
你好,史密斯。很高兴知道你22岁了。我认为成为一名设计师是了不起的。
实例变量的手动打印与调用shout时的greet相同我看不到任何类属性。只有实例属性是。我没有使用类属性,因为我希望每个实例都有自己的值。好吧,那么我一定是误解了这个问题,因为你问题的第一行说:我希望能够更改类内的变量对不起,我的定义不好,谢谢。我看不到任何类属性。只有实例属性是。我没有使用类属性,因为我希望每个实例都有自己的值。好吧,那么我一定是误解了这个问题,因为你问题的第一行说:我希望能够更改类内的变量对不起,我的定义不好,谢谢。实际上,似乎更符合逻辑。我不需要在每次有东西改变时都操纵“问候语”,只有在我必须使用它的时候才需要。事实上,这似乎更符合逻辑。我不需要在每次更改某些内容时都操纵“问候语”,只有在我必须使用它时才需要。