Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改实例变量时更改另一个实例变量_Python_Class - Fatal编程技术网

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岁了。我认为成为一名设计师是了不起的。 实例变量的手动打印与调用shout

self时的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相同

我看不到任何类属性。只有实例属性是。我没有使用类属性,因为我希望每个实例都有自己的值。好吧,那么我一定是误解了这个问题,因为你问题的第一行说:我希望能够更改类内的变量对不起,我的定义不好,谢谢。我看不到任何类属性。只有实例属性是。我没有使用类属性,因为我希望每个实例都有自己的值。好吧,那么我一定是误解了这个问题,因为你问题的第一行说:我希望能够更改类内的变量对不起,我的定义不好,谢谢。实际上,似乎更符合逻辑。我不需要在每次有东西改变时都操纵“问候语”,只有在我必须使用它的时候才需要。事实上,这似乎更符合逻辑。我不需要在每次更改某些内容时都操纵“问候语”,只有在我必须使用它时才需要。