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,而其他参数不需要这个操作呢?
其他参数(plate_number和capacity)可能是不可变的(大概是一个字符串和一个整数)。然而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)