如果给出相同的名称,python类中的属性是否会更改值?

时间:2017-08-18 21:06:37

标签: python oop

我正在学习Python OOP编程,我正在运行这个小脚本:

class Employee:

    def __init__(self, first, last):

        self.first = first
        self.last = last

emp1 = Employee("Fede", "Cuci")

print emp1.first
print emp1.last

一切正常,直到我注意到当我创建一个具有相同属性的方法并将其打印出来时,它将取代这些值:

class Employee:

    def __init__(self, first, last):

        self.first = first
        self.last = last

    def fullname(self, first, last):

        self.first = first
        self.last = last

    def other_fullname(self, first, last):

        self.first = first
        self.last = last


emp1 = Employee("Fede", "Cuci")
emp1.fullname("Fede2", "Cuci2")
emp1.other_fullname("Fede3", "Cuci3")

print emp1.first
print emp1.last

然后我注意到它总会打印出最后一个调用的方法。这是否意味着您应该在每个类中以不同的方式命名属性,并使用此技术仅更新属性的值,或者我的代码中是否有错误?

我认为通过在每个方法中放置"self",会使该属性对该特定方法唯一,而不是如果我再次尝试打印该属性,它会根据我调用的方法更新它的值最后...

如果我错了,请纠正我, 提前谢谢,

菲德

2 个答案:

答案 0 :(得分:1)

self是对当前实例的引用。该实例上的属性并非每个方法都是唯一的,不是。方法的重点是能够操纵实例的状态。

在每次方法调用后打印这两个属性,并且您会看到它们随着每种方法操作这些属性而发生变化:

>>> emp1 = Employee("Fede", "Cuci")
>>> emp1.first
'Fede'
>>> emp1.last
'Cuci'
>>> emp1.fullname("Fede2", "Cuci2")
>>> emp1.first
'Fede2'
>>> emp1.last
'Cuci2'
>>> emp1.other_fullname("Fede3", "Cuci3")
>>> emp1.first
'Fede3'
>>> emp1.last
'Cuci3'

所以是的,如果每个方法都需要将自己的状态绑定到实例,那么您需要使用唯一的名称。

如果属性对于每个方法都是唯一的,那么您可能永远不会有两种不同的方法对同一条信息进行操作。

答案 1 :(得分:0)

Self是该类的实例。如果您希望每个方法都在对象中存储自己的名称,则需要为其提供唯一属性。

例如

def fullname(self, first, last):

    self.fullNameFirst = first
    self.fullNameLast = last