Python的Object.create()功能的Python等价物是什么?
例如,在JS中这是可能的:
var s = { 'pots': 5, 'cups': 2 };
var t = Object.create( s );
console.log( t['pots'] ); // 5
t['pots'] = 9000;
console.log( t['pots'] ); // 9000
console.log( t['__proto__']['pots'] ); // 5, unchanged
s['pots'] = 33;
console.log( t['pots'] ); // 9000, unchanged
console.log( t['__proto__']['pots'] ); // 33
我能想到的最接近的事情是使用copy:
s = { 'pots': 5, 'cups': 2 }
t = copy.copy( s )
它有效,但每次我想继承其属性时,创建引用对象的新副本似乎非常浪费。
此外,我正在使用上面所示类型的简单对象...而不是类实例。
答案 0 :(得分:3)
字典类dict
在其构造函数中接受另一个字典。
s = { 'pots': 5, 'cups': 2 }
t = dict(s)
这是一个浅层副本,当您将不可变对象用作值时,这很好。 (键必须始终是不可变类型。)如果您使用可变容器(如其他词典(或列表或其他各种类型))作为值,则应使用copy.deepcopy()
。
重要的是要注意,在Python中,容器中的项(如dict
)和对象上的属性完全不同,以不同的方式访问,并且都不像JavaScript中的属性。您实际上要做的事情是通过Python中的类更好地实现:
class Thing(object):
pots = 5
cups = 2
s = Thing()
t = Thing()
在这种情况下,s.pots
访问存储在Thing
类上的值,直到您实际分配s.pots
为止,此时该属性的实例值会影响存储在类中的值。因此,实例上仅对实际已分配的属性使用空间。
您还可以在类上定义__slots__
以仅允许指定特定名称的属性;这可以减少实例的内存开销,如果你要创建很多实例,这很方便。
使用变量(或表达式)而不是点表示法访问属性的Python方法是getattr()
函数。可以创建一个可以使用.
或[]
访问相同数据的对象,但它比您希望的更准确完全就像它一样在JavaScript中。
当您使用类时,最接近您的示例(给定s
,创建t
并拥有s
自己的属性)是这样的:
t = type(s)()
t.__dict__.update(s.__dict__)
您可以提供一种方法来执行此操作:
class Cloneable(object):
def clone(self):
inst = type(self)()
inst.__dict__.update(self.__dict__)
return inst
然后从Thing
而不是Cloneable
派生object
,您可以这样做:
s = Thing()
t = s.clone()