在类属性中嵌入列表并调用其值

2024-10-01 22:35:41 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有以下课程:

class theater:
    def __init__(self):
        self.__seatMatrix=[10]*5
        self.__seats=seating[0]
        self.__rows=len(seating)

如何实现get/setter来更新seats的值? 这个想法是座位=[10]*5,5排10个座位。 整个周末我都在想这个。 当我尝试时:

def getseats(self):
        self.__seats

它不返回任何东西。你知道吗

/安迪


Tags: selfgetleninitdefclass课程setter
3条回答

您可以使用属性包装座椅的getter/setter对:

@property
def seats(self): return self.__seats 
# As Jarret pointed out, don't forget the return value

@seats.setter
def seats(self, value): self.__seats = value

或者可以实现__getitem____setitem__,将对象视为一个座位列表:

def __getitem__(self, index): return self.__seats[index]

def __setitem__(self, index, value): self.__seats[index] = value

不要忘记函数实现中的return语句。与其他一些语言不同,Python不会自动返回在函数中计算的最后一个表达式。没有return语句的函数的返回值是None。你知道吗

在这种情况下,getseats()方法应该是:

def getseats(self):
    return self.__seats

另外,如果您想将类中的某些变量指定为半私有(我说半私有是因为完全私有的变量实际上并不存在),Python中的约定是使用一个下划线(因此self._seats而不是self.__seats)。以双下划线为前缀的实例变量实际上会破坏名称,试图将其指定为private,这可能会产生令人惊讶的结果,如果这不是您想要的。你知道吗

python文档对此进行了最好的解释:http://docs.python.org/tutorial/classes.html#private-variables

如前所述,不要使用双引线下划线,除非确定需要。这不是Java,您不必有私有类成员。也就是说,这不是你有问题的原因,这是缺乏回报声明,因为有人比我更敏锐的眼睛看到。你知道吗

总之,下面是如何在Python中实现它:

class Theater:
  self __init__(self, seating)
   self.seating = seating
   self.seats = seating[0]
   self.rows = len(seating)

完成。请注意,完全缺乏getter和setter,您不需要它们。不要试图对自己隐藏数据。无论如何,你不能

>>> class Theater:
...    def __init__(self, data):
...       self.__private_data = data
... 
>>> t = Theater("Private data")
>>> t._Theater__private_data
'Private data'

哦,我想反正也没那么私人。Python没有私有成员。这是而不是Java。你知道吗

相关问题 更多 >

    热门问题