【问题标题】:Changing an instance variable when another has been changed当另一个实例变量被改变时改变一个实例变量
【发布时间】:2023-03-08 21:53:01
【问题描述】:

我希望能够更改类中的变量(在本例中为 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

输出是:

名字 John Doe
年龄
工作 程序员
问候你好约翰·多伊。我认为 成为一名程序员真是太棒了。

姓名贾尼斯·乔普林
34 岁
职业歌手
问候你好贾尼斯杜。很高兴知道您今年 34 岁。我认为成为一名歌手真是太棒了。

史密斯的名字
22 岁 工作设计师
问候你好

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

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

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

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

欢迎指路

(后期编辑)

按照亚当·斯密,暗示我宁愿尝试将“问候”作为实例属性,如下所示:

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 attributes。仅限instance attributes
  • 是的。我没有使用类属性,因为我希望每个实例都有自己的值。
  • 好的,那么我一定误解了这个问题,因为你问题的第一行说:我希望能够更改 class 中的变量
  • 抱歉我的定义不好,谢谢。

标签: python class


【解决方案1】:

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

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))

【讨论】:

  • 确实,似乎更符合逻辑。每次更改某些内容时,我都不需要操纵“问候”,只有在我必须使用它时才需要。
【解决方案2】:

self.greet__init__ 期间被计算并且永远不会再次重新计算。

我最好的方法是将greet 设为属性。因此,您仍然可以使用您拥有的语法

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

这样,每次get 时,greet 都会重新计算。

现在执行你的测试代码:

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.

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

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

Hello Smith. Good to know that you is 22 years old. I think being a Designer is amazing.

并且实例变量的手动打印与调用shout时的greet相同

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 2014-11-19
    • 1970-01-01
    • 2015-06-09
    • 2021-11-03
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多