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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 关于实例的属性 雇员类别: 定义初始自我,第一个,最后一个: self.f=第一个 self.l=最后一个 只是检查一下 self.full=self.f+“”+self.l 第一个=雇佣米老鼠 第一,f=Ricky printfirst.full打印米老鼠_Python_Python 3.x_Oop - Fatal编程技术网

Python 关于实例的属性 雇员类别: 定义初始自我,第一个,最后一个: self.f=第一个 self.l=最后一个 只是检查一下 self.full=self.f+“”+self.l 第一个=雇佣米老鼠 第一,f=Ricky printfirst.full打印米老鼠

Python 关于实例的属性 雇员类别: 定义初始自我,第一个,最后一个: self.f=第一个 self.l=最后一个 只是检查一下 self.full=self.f+“”+self.l 第一个=雇佣米老鼠 第一,f=Ricky printfirst.full打印米老鼠,python,python-3.x,oop,Python,Python 3.x,Oop,为什么first.f中的更改在first.full中没有反映出来?因为self.full在创建对象时只设置了一次。如果您更改了self.f,它不会更新 您需要一种方法,在发生更改时更新full的值: class empl(): def __init__(self,fist,last): self.f=fist self.l=last #Just checking something self.full=self.f + '

为什么first.f中的更改在first.full中没有反映出来?

因为self.full在创建对象时只设置了一次。如果您更改了self.f,它不会更新

您需要一种方法,在发生更改时更新full的值:

class empl():
    def __init__(self,fist,last):
        self.f=fist
        self.l=last
        #Just checking something
        self.full=self.f + ' ' + self.l

    def change_f(self, new_val):
        self.f = new_val
        # Make sure to update
        self.full=self.f + ' ' + self.l

first=empl('Micki','Mouse')

first.change_f("Ricky")

print(first.full) # Will now print Ricky Mouse 

要使self.fullname依赖于self.f和self.l,请将其设置为属性:

现在,将使用 self.f和self.l的当前值,而不是存储字符串 由可能过期的名字和姓氏创建

请注意,按原样,您不能直接更改全名,只能分别更改名字和姓氏。这是一个特点。如何使全名可分配超出了本答案的范围

表达式self.f+“”+self.l未链接到self.f或self.l引用的对象;从图形上讲,您可以从

(1)
self.f ------>  "foo"
self.l ------>  "bar"

(2)
self.f ------>  "foo"
self.l ------>  "bar"
self.full --->  "foo bar"
不象

(3)
self.f ------>  "foo"  <----\
                  " "  <----+---self.full
self.l ------>  "bar"  <----/
随着foo到foo的变化,self.f和self.full都会受到影响。你只能改变self.f所指的,比如

(5)
          +--> "fpo"
          |
self.f ---+     "foo"  <----\
                  " "  <----+---self.full
self.l ------>  "bar"  <----/

然而,任何这样的内存共享都只是一个实现细节,而不是Python本身可见的东西。实际上,您只能看到2,不管字符串foo和bar在内存中是表示一次还是两次。

因为您构建了一个新字符串,而不是字符串的未编译结构。如果您希望根据这些属性的当前值动态计算字符串,请使用@property.wdym,因为我是OOP新手,所以我不太明白。介意详细解释一下吗?仅仅因为它不是抽象的Python方式,并不意味着它是错误的。然而,我将进行编辑,以反映出这里重要的不是setter函数,而是full需要被修改的事实updated@Artog感谢您的回复,我可以再次确认,当我像first.f='Ricky'一样重新分配我的员工名字时,它是更新了我的原始值还是创建了一个新值?@no_-mad字符串是不可变的,您不能更新原始值。setter类型方法的问题不仅仅是抽象的:您仍然可以直接设置self.f、或l,甚至是full,这有点像脚踏枪。如果full是基于f和l的只读属性,那么很难意外地做错误的事情。@jornsharpe是的,你是对的。所以当我这样做时,它基本上会创建一个新属性,下次我调用该属性时,它会给我一个新的属性?我说得对吗?
(4)
self.f ------>  "fpo"  <----\
                  " "  <----+---self.full
self.l ------>  "bar"  <----/
(5)
          +--> "fpo"
          |
self.f ---+     "foo"  <----\
                  " "  <----+---self.full
self.l ------>  "bar"  <----/