首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相当于JavaScript的Object.create()

相当于JavaScript的Object.create()
EN

Stack Overflow用户
提问于 2017-02-11 00:55:33
回答 1查看 576关注 0票数 2

什么是Python等同于JavaScript的Object.create()功能?

例如,在JS中,这是可能的:

代码语言:javascript
复制
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

我能想到的最接近的事情就是使用复制

代码语言:javascript
复制
s = { 'pots': 5, 'cups': 2 }
t = copy.copy( s )

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

我也在处理上面看到的简单的对象.不是类实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-11 01:19:38

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

代码语言:javascript
复制
s = { 'pots': 5, 'cups': 2 }
t = dict(s)

这是一个浅拷贝,当您使用不可变对象作为值时,这是很好的。(键必须始终是不可变类型。)如果您使用可变容器(如其他字典(或列表,或各种其他类型)作为值,则应使用copy.deepcopy()

需要注意的是,在Python中,容器中的项(如dict)和对象上的属性是完全不同的,以不同的方式访问,两者都不完全像JavaScript中的属性。实际上,您要做的事情最好是通过Python中的类来完成:

代码语言:javascript
复制
class Thing(object):
    pots = 5
    cups = 2

s = Thing()
t = Thing()

在本例中,s.pots访问存储在Thing类上的值,直到实际分配s.pots为止,此时,该属性的实例值与类上存储的值相形见绌。因此,空间仅用于实例中实际分配的属性。

您还可以在类上定义__slots__,只允许分配特定名称的属性;这可以减少实例的内存开销,如果要创建大量实例,这很方便。

使用变量(或表达式)而不是点表示法访问属性的Python方式是getattr()函数。创建一个可以使用.[]访问相同数据的对象是可能的,但要使其与JavaScript中的操作完全相同,则要复杂得多。

在使用类时,与示例最接近的等价项(给定一个s,创建一个具有s自身属性的t )如下所示:

代码语言:javascript
复制
t = type(s)()
t.__dict__.update(s.__dict__)

您可以提供这样做的方法:

代码语言:javascript
复制
class Cloneable(object):
    def clone(self):
        inst = type(self)()
        inst.__dict__.update(self.__dict__)
        return inst

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

代码语言:javascript
复制
s = Thing()
t = s.clone()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42170988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档