2014-02-20 1 views
1

Приступая к скорости обучения. Я читал, что конструктор (def init в Python) должен устанавливать только назначенные переменные, которые вычисляемые атрибуты экземпляра должны быть установлены через свойство. Кроме того, использование @property предпочтительнее для getter/setter в стиле Java.Python - несколько операторов @property в определении класса?

ОК, но каждый пример, который я когда-либо видел, устанавливает только одно свойство. Предположим, у меня есть объект с тремя сложными атрибутами, которые нужно вычислить, спросить и т. Д. Как вы представляете несколько получателей, сеттеров, удалителей @property? Вот пример из другого post:

class C(object): 
    def __init__(self): 
     self._x = None 

    @property 
    def x(self): 
     """I'm the 'x' property.""" 
     return self._x 

    @x.setter 
    def x(self, value): 
     self._x = value 

    @x.deleter 
    def x(self): 
     del self._x 

Так что, если у меня было три переменные экземпляра, которые были рассчитаны значения на основе некоторых других атрибутов, это будет выглядеть как этот

class C(object): 
    def __init__(self): 
     self._x = None 

    @property 
    def x(self): 
     """I'm the 'x' property.""" 
     return self._x 

    @x.setter 
    def x(self, value): 
     self._x = value 

    @x.deleter 
    def x(self): 
     del self._x 

    @property 
    def y(self): 
     """I'm the 'y' property.""" 
     return self._y 

    @y.setter 
    def y(self, value): 
     self._y = value 

    @y.deleter 
    def y(self): 
     del self._y 

    @property 
    def z(self): 
     """I'm the 'z' property.""" 
     return self._z 

    @z.setter 
    def z(self, value): 
     self._z = value 

    @z.deleter 
    def z(self): 
     del self._z 

Или тот факт, что я только когда-либо увидеть одно заявление @property означает, что наличие класса с более чем одним @property - плохая идея?

ответ

3

Нет, вы можете использовать несколько декораторов @property для вашего сердца. Здесь нет предела, кроме, по-видимому, фантазий писателей.

Стандартная библиотека Питон полна @property использования, если вы хотите примеры:

  • numbers определяет азбуку для классов чисел в Python.

  • tempfile реализует объекты временного файла

  • threading provding поддержки потоков выше уровня

  • urlparse для обработки URL-адресов и строки запроса.

т.д.

Вы должны были это пятно на; несколько свойств будут выглядеть точно так же, как и вы опубликовали.

+0

Спасибо за помощь всем - у меня много отличных отзывов! –

0

это неплохая идея. это обычный шаблон свойств.

другой узор делает как:

class A(object): 

    def _get_a(self): 
     return self._a 

    def _set_a(self, v) 
     self._a = v 

    def _del_a(self) 
     del self._a 

    a = property(_get_a, _set_a, _del_a) 

результат тот же, что и в первом примере, и вы можете использовать его столько, сколько вы хотите. инициализация self._a в конструкторе - хорошая идея, так как в противном случае доступ к ней ПЕРЕД вызовом self.a будет поднимать AttributeError

+0

Рассмотрите возможность использования только 'myObj.foo' или' myObj.foo() 'over' myObj.set_foo() '.Люди отличаются друг от друга, но есть консенсус в том, что get_ обычно не полезен и просто делает вещи похожими на Java. –

+0

Спасибо, я не думал об инициализации. Поэтому я бы просто сказал что-то вроде def __init __ (self, a = None): self.a = a? –

+0

Да, это будет то же самое, и более инкапсулировано. –

0

Это может быть уродливо, но так оно и работает. В общем, рекомендация pythonic состоит в том, чтобы не создавать простые сеттеры/получатели, которые напрямую обращаются к собственной переменной (если вы не знаете, что интерфейс, вероятно, изменится). Предполагая, что причиной свойств являются «сложные вычисления», как вы сказали, нет ярлыка для несколько уродливого шаблона. См. Эту ссылку http://tomayko.com/writings/getters-setters-fuxors