Skip to main content
 首页 » 编程设计

javascript之Python 相当于 JavaScript 的 Object.create()

2024年08月21日42mfrbuaa

JavaScript 的 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 ) 

它可以工作,但是每次我想继承它的属性时都创建一个引用对象的新副本似乎很浪费。

此外,我正在使用上面看到的类型的简单对象......而不是类实例。

请您参考如下方法:

字典类 dict 在其构造函数中接受另一个字典。

s = { 'pots': 5, 'cups': 2 } 
t = dict(s) 

这是一个浅拷贝,当您使用不可变对象(immutable对象)作为值时,这很好。 (键必须始终是不可变类型。)如果您使用其他字典(或列表或各种其他类型)等可变容器作为值,则应使用 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,创建一个具有 s 自己的属性的 t ) 是这样的:

t = type(s)() 
t.__dict__.update(s.__dict__) 

你可以提供一个方法来做到这一点:

class Cloneable(object): 
    def clone(self): 
        inst = type(self)() 
        inst.__dict__.update(self.__dict__) 
        return inst 

然后从 Cloneable 而不是 object 派生 Thing,你可以这样做:

s = Thing() 
t = s.clone()