Python相当于JavaScript的'Object.defineProperty()`

时间:2015-09-04 00:45:45

标签: javascript python properties

当我从JavaScript过渡到Python时,我注意到我还没有找到一种方法来为数据类型类添加属性。 例如,在JavaScript中,如果我希望能够键入arr.last并让它返回数组arr中的最后一个元素,或者键入arr.last = 'foo'并将最后一个元素设置为{ {1}},我会用:

'foo'

然而,在Python中,我不确定如何做相当于Object.defineProperty(Array.prototype,'last',{ get:function(){ return this[this.length-1]; }, set:function(val){ this[this.length-1] = val; } }); var list = ['a','b','c']; console.log(list.last); // "c" list.last = 'd'; console.log(list); // ["a","b","d"]

注意:我询问如何执行特定的示例函数,我正在尝试使用Object.defineProperty(X.prototype,'propname',{get:function(){},set:function(){}});和{{1}来定义属性原始数据类型(str,int,float,list,dict,set等)

3 个答案:

答案 0 :(得分:4)

在Python 2 1 中,将新属性(也称为成员对象,包括方法)添加到新样式类(从object派生的类)就像简单地定义它们一样简单:

class Foo(object):
    def __init__(self):
        self._value = "Bar"

def get_value(self):
    return self._value

def set_value(self, val):
    self._value = val

def del_value(self):
    del self._value

Foo.value = property(get_value, set_value, del_value)
f = Foo()

print f.value
f.value = "Foo"
print f.value

我使用了Dan D.在property中提到的his answer内置函数,但实际上在创建类之后会分配属性,就像问题一样。

Online demo

1:在Python 3中,它更简单,因为所有类都是新式类

答案 1 :(得分:2)

请参阅property函数的文档。它有例子。以下是Python 2.7.3中print property.__doc__的结果:

property(fget=None, fset=None, fdel=None, doc=None) -> property attribute

fget is a function to be used for getting an attribute value, and likewise
fset is a function for setting, and fdel a function for del'ing, an
attribute.  Typical use is to define a managed attribute x:
class C(object):
    def getx(self): return self._x
    def setx(self, value): self._x = value
    def delx(self): del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

Decorators make defining new properties or modifying existing ones easy:
class C(object):
    @property
    def x(self): return self._x
    @x.setter
    def x(self, value): self._x = value
    @x.deleter
    def x(self): del self._x

答案 2 :(得分:0)

如果我理解正确,你想编辑现有的类(添加方法)看看这个帖子Python: changing methods and attributes at runtime