当我从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等)
答案 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内置函数,但实际上在创建类之后会分配属性,就像问题一样。
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