在定义类的属性时进行强制转换?

Ber*_*art 2 python attributes class

我是一名 Python 新手,正在研究对象编程。研究我的老师代码,我发现了一些奇怪的东西self.items = list(items)。看一下整体代码:

class Truck():  
    '''
    This class models a truck
    '''
    def __init__(self, plate_number, capacity, items):
        '''
        Constructor of an object of class Truck
        :param plate_number: a unique number Identifying the truck
        :param capacity: maximum weight that the truck can carry
        :param items: list of objects of class Item carried by the truck
        '''
        self.plate_number = plate_number
        self.capacity = capacity
        self.items = list(items)
Run Code Online (Sandbox Code Playgroud)

那么,为什么我要强制转换该参数items,而其他参数不需要这个操作呢?

Dee*_*ace 5

其他参数(plate_numbercapacity)可能是不可变的(大概是一个字符串和一个整数)。然而items,这是一个可变的列表(如果我们信任文档字符串)。

Truck按原样使用它__init__会导致影响truck_obj.items原始传递的更改items列表进行更改(反之亦然)。

调用list(items)会将新创建的列表分配给self.items。这也可以通过使用切片语法来实现:self.items = items[:]

比较:

class A:
    def __init__(self, items):
        self.items = items


li = [1, 2]

obj = A(li)
li[0] = 9
print(obj.items)
#  [9, 2]  oops! we modified obj.items without intending to
Run Code Online (Sandbox Code Playgroud)

class A:
    def __init__(self, items):
        self.items = list(items)  # or items[:]


li = [1, 2]

obj = A(li)
li[0] = 9
print(obj.items)
#  [1, 2]
Run Code Online (Sandbox Code Playgroud)