2015-09-04 3 views
1

Когда я перехожу из JavaScript в Python, я заметил, что не понял способ добавления свойств к классам типов данных. Например, в JavaScript, если бы я хотел, чтобы иметь возможность ввести arr.last и он возвращает последний элемент в массиве arr, или введите arr.last = 'foo' и установить последний элемент 'foo', я хотел бы использовать:Python эквивалент JavaScript `Object.defineProperty()`

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"] 

Однако в Python, я не знаю, как сделать эквивалент Object.defineProperty(X.prototype,'propname',{get:function(){},set:function(){}});

Примечание: Я являюсь не с просьбой о том, как сделать конкретный пример функции, я стараюсь, чтобы иметь возможность определить свойство с get и set на типы примитива данных (строка, INT, поплавок, список, Словарь, набор и т.д.)

+0

Может быть, вы хотите, чтобы прочитать о [стандартных типов] (https: // Docs. python.org/3/library/stdtypes.html)? Вы можете делать это прямо в Python, без мешающих бит, мешающих. Другими словами, при попытке определить свойства и getters/seters у вас, вероятно, есть [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – TigerhawkT3

ответ

0

Если я вас правильно понял, вы хотите изменить существующие классы (добавить метод) Проверить эту нить Python: changing methods and attributes at runtime

+0

Я не уверен, правильно ли я понял это сообщение, но похоже, что он создает новый класс, который может изменить его атрибуты, в отличие от того, что я хочу (возможность изменять атрибуты класса, который был определен с помощью Python (например, int) – Cyoce

+0

@Cyoce Не все классы равны в Python, в основном из-за соображений производительности/реализации. – user2864740

2

См. Документацию функции property. У него есть примеры. Ниже приведен результат print property.__doc__ под Python 2.7.3:

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 
+0

Это не добавляет существующих функциональных возможностей во время выполнения, например OP. – Mego

4

В Python 2 , добавление новых атрибутов (ака объектов-членов, в том числе методов) к классу нового стиля (один, который вытекает из 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 

Я использую property встроенную команду, что Дэн Д. упоминается в his answer, но это на самом деле присваивает атрибут после создается класс, как вопрос спрашивает.

Online demo

1: в Python 3, это даже проще, так как все классы новых классов

Смежные вопросы