Автор Тема: Есть ли в питоне статические свойства?  (Прочитано 16733 раз)

AdminUser

  • Team Lead
  • Юный джедай
  • *****
  • Сообщений: 65
  • Репутация +8/-0
    • Просмотр профиля
Есть ли в питоне статические свойства?

DigitalMag

  • Юный джедай
  • **
  • Сообщений: 89
  • Репутация +6/-0
    • Просмотр профиля
Re: Есть ли в питоне статические свойства?
« Ответ #1 : Марта 02, 2019, 01:57:09 pm »
Короткий ответ - нет. В питоне есть свойства для инстансов, но не для класса, и вы их никак не сымитируете, например:

class Fees(object):
 
    Fee = 15

    @classmethod
    def get_fee():
        return Fees.Fee

    @classmethod
    def set_fee(value):
        print "no set"

    fee = property(get_fee, set_fee)

def main():
    f = Fees()

    Fees.fee = "2"
    print Fees.fee

Как видите, строка Fees.fee = "2" просто переопределяет атрибут класса. Он становится полем и никакого set_fee не вызывает. Тогда как для экземпляров это работает:

class Fees(object):
    """"""
    def __init__(self):
        """Конструктор"""
        self._fee = None

    def get_fee(self):

        return self._fee

    def set_fee(self, value):
        print "set"
        self._fee = value

    fee = property(get_fee, set_fee)

def main():
    f = Fees()

    f.fee = "2"
    print( f.fee )

AdminUser

  • Team Lead
  • Юный джедай
  • *****
  • Сообщений: 65
  • Репутация +8/-0
    • Просмотр профиля
Re: Есть ли в питоне статические свойства?
« Ответ #2 : Марта 02, 2019, 02:55:44 pm »
А можно ли как-то эту возможность прикрутить? Я, например, хочу, переопределить поле класса в наследнике на свойство класса

« Последнее редактирование: Марта 02, 2019, 03:08:45 pm от AdminUser »

DigitalMag

  • Юный джедай
  • **
  • Сообщений: 89
  • Репутация +6/-0
    • Просмотр профиля
Re: Есть ли в питоне статические свойства?
« Ответ #3 : Марта 02, 2019, 02:57:16 pm »
А можно ли как-то эту возможность прикрутить? Я, например, хочу, переопределить поле класса в наследнике на свойство
Думаю, да. Через metaclass, атрибуты __getattr__, __setattr__ либо __getattribute__  и прочее, но надо взвесить все за и против. Действительно ли оно вам нужно?
« Последнее редактирование: Марта 02, 2019, 03:03:37 pm от AdminUser »