Использование @property в атрибуте базового класса - PullRequest
1 голос
/ 25 апреля 2020

У меня есть базовый класс, который недоступен, и я хочу использовать один из его атрибутов как @property. Мне нужно в основном .setter, потому что есть некоторые проверки, которые мне нужно сделать для значения. Я не могу настроить свойство с другим именем, чем атрибут. Ниже в основном то, что я хочу сделать. Есть ли способ сделать это?

class Base:
    def __init__(self):
        self.var = ""

class Child(Base):
    @property
    def var(self):
        #getter

    @var.setter
    def var(self, value):
        #super.var = value

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Хорошая вещь с наследованием состоит в том, что, как только вы определили @property.setter) с тем же именем, что и атрибут родителя, __init__ родителя уже будет вызывать этот установщик @property ! (или, если у него нет установщика, AttributeError будет повышен)

Так что в основном все, что вам нужно сделать, это установить внутреннее имя для атрибута Child:

class Child(Base):
    @property
    def var(self):
        return self._var

    @var.setter
    def var(self, value):
        self._var = value

Теперь мы можем использовать следующий код для отслеживания выполнения:

class Base:
    def __init__(self):
        print("In Base's __init__ - setting `var` with 'default'")
        self.var = "default"

class Child(Base):
    @property
    def var(self):
        print("In Child's `var` @property getter - getting `_var`")
        return self._var

    @var.setter
    def var(self, value):
        print(f"In Child's `var` setter - setting `_var` with {value}")
        if isinstance(value, int):
            raise TypeError("Can't set var to an int!")
        self._var = value

c = Child()
print("-")
print(f"c.__dict__ - {c.__dict__}")
print("-")
print(f"c.var - {c.var}")
print("-")
c.var = "new"
print("-")
print(f"new c.var - {c.var}")
print("-")
c.var = 3

И результат будет:

In Base's __init__ - setting `var` with 'default'
In Child's `var` setter - setting `_var` with default
-
c.__dict__ - {'_var': 'default'}
-
In Child's `var` @property getter - getting `_var`
c.var - default
-
In Child's `var` setter - setting `_var` with new
-
In Child's `var` @property getter - getting `_var`
new c.var - new
-
In Child's `var` setter - setting `_var` with 3
Traceback (most recent call last):
  File "C:/Users/tomer/Desktop/python/tests.py", line 29, in <module>
    c.var = 3
  File "C:/Users/tomer/Desktop/python/tests.py", line 16, in var
    raise TypeError("Can't set var to an int!")
TypeError: Can't set var to an int!
0 голосов
/ 25 апреля 2020

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

, например: -

class Base():
    self.var = ""

class Child(Base):
    def __init__(self):
       var=super().var
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...