Какой самый простой способ определить сеттер и геттер в Python - PullRequest
5 голосов
/ 06 марта 2012

Какой самый простой способ определить сеттер и геттер в Python? Есть ли что-нибудь как в C #

public int Prop {get; set;}

Как сделать так? Поскольку писать как методы-установщики, так и методы-получатели для одного свойства, подобного этому, это слишком много работы.

class MyClass():
    def foo_get(self):
        return self._foo

    def foo_set(self, val):
        self._foo = val

    foo = property(foo_get, foo_set)

Заранее спасибо!

Ответы [ 3 ]

17 голосов
/ 06 марта 2012

Если установщик и получатель не делают ничего, кроме доступа к базовому реальному атрибуту, то самый простой способ их реализации - вообще не писать установщики и получатели. Это стандартное поведение, и нет смысла писать функции, воссоздающие поведение атрибута.

Вам не нужны геттеры и сеттеры для обеспечения инкапсуляции в случае, если ваша логика доступа изменится позже на стандартную механику доступа, так как введение свойства не нарушит ваш интерфейс.

Python - это не Java. (И, кстати, тоже не C #).

9 голосов
/ 06 марта 2012

Обычно вы вообще не пишете сеттеры / геттеры. В этом нет никакого смысла, так как python не запрещает кому-либо напрямую обращаться к атрибутам. Однако, если вам нужна логика, вы можете использовать property s

class Foo(object):
    def __init__(self, db):
        self.db = db

    @property
    def x(self):
        db.get('x')

    @x.setter
    def x(self, value):
        db.set('x', value)

    @x.deleter
    def x(self):
        db.delete('x')

Затем вы можете использовать эти методы свойств так же, как и значение базового атрибута:

foo = Foo(db)
foo.x
foo.x = 'bar'
del foo.x
1 голос
/ 06 марта 2012

property - это встроенная функция в Python, см. эту ссылку об их использовании. Он работает без паренов, поэтому вы можете начать с предпочтения Свена просто использовать атрибут, а затем изменить его на использование геттеров и сеттеров.

...