我有几个问题。请记住,我需要使用deepcopy,因为我的类将在复杂性方面不断扩展。你知道吗
import copy
# Global
NODES = []
# Classes
class Node(object):
def __init__(self, name, age):
self.name = name
self.age = age
class Truck(Node):
def __init__(self, name="", age=0):
super(Truck, self).__init__(name=name, age=age)
NODES.append(self)
class Car(Node):
def __init__(self, name="", age=0):
super(Car, self).__init__(name=name, age=age)
NODES.append(self)
def __deepcopy__(self, memo):
print '__deepcopy__(%s)' % str(memo)
return Car(copy.deepcopy(self, memo))
Truck( name="Tonka Truck")
Truck( name="Monster Truck")
Truck( name="Pickup Truck")
car = Car( name="Oldsmobile Car")
car.age = 55
new_car = copy.deepcopy( car )
type_name = "Car"
cars = [x for x in NODES if type(x).__name__ == type_name]
print cars
print "NODES:"
for node in NODES:
print "\t", node.name, node.age
首先,你真的应该用
defaultdict
来做玩具。它只满足这个要求如果超类不存在,它会添加和附加对象。所以我们一起去吧如果不想使用
copy.deepcopy
,只需将Node.__init__
方法更改为:创建新卡车时,它可以正常工作:
给予真实
不幸的是,
deepcopy
使用了一种特殊的构造方案,并在这里绕过了__init__
。你知道吗但是当
__init__
做不到的时候,就打电话给__new__
帮忙。。。你知道吗__new__
是一个较低级别的特殊方法,称为类方法,用于在调用__init__
之前创建对象。即使是deepcopy
创建的对象也是用__new__
创建的。由于它是一个类方法,您只需要声明超类名称(顺便说一句,超类是另一种动物,您应该使用不同的名称…)作为类属性。你知道吗您的代码变成:
使用此输出:
这证明:
Trucks
列表已自动添加到Toys
t
创建为Truck()
,已正确添加到Toys['Trucks']
t2
使用deepcopy
创建已正确添加到Toys['Trucks']
现在您只需将此代码更改为
superclass
名称即可接受。。。你知道吗相关问题 更多 >
编程相关推荐