Я потратил этот день, пытаясь найти ответ на этот вопрос, но ничего не придумал.Python - Обновление дочерних атрибутов методом базового класса
Предположим, у меня есть несколько классов, каждый из которых содержит методы, идентичные методам в других.
class A:
def __init__(self, attr1, attr2, color):
self.__attr1 = attr1
self.__attr2 = attr2
self.__color = color
def set_color(self, color):
self.__color = color
class B:
def __init__(name, attr3, attr4, color):
self.__attr3 = attr3
self.__attr4 = attr4
self.__color = color
def set_color(self, color):
self.__color = color
В этом примере, идентичные методы сводятся к только один идентичный метод, set_color, чтобы проиллюстрировать то, что я пытаюсь сделать.
Есть ли способ устранить повторяющийся код, возможно, с абстрактным классом следующим образом?
class Parent:
def set_color(self, color):
self.__color = color
class A(Parent):
def __init__(self, attr1, attr2, color):
self.__attr1 = attr1
self.__attr2 = attr2
self.__color = color
class B(Parent):
def __init__(name, attr3, attr4, color):
self.__attr3 = attr3
self.__attr4 = attr4
self.__color = color
exampleA = A(attr1, attr2, "blue)
Я хочу, чтобы иметь возможность изменения от синего до красного так, как этот , так что я не должен определять те же методы, в пределах каждого класса A
и B
exampleA.set_color("red")
, но это не работает, как я ожидал, он не меняет значение exampleA.__color
Для получения дополнительной информации см. [Значение одно- и двухзначного символа перед именем объекта в Python] (http://stackoverflow.com/q/1301346/4014959) –
Я понимаю, что это просто пример, но методы setter (и методы getter) не считаются Pythonic, если вы не нуждаетесь в них, чтобы делать «магические» вещи. Если вы просто хотите установить значение атрибута, просто установите его напрямую. –
@ PM2Ring: На самом деле, даже если вы не хотите, чтобы они делали магические вещи, если вам не нужно делать это явным, как часть интерфейса, что волшебство происходит, вам все равно лучше не использовать геттер и сеттер '@ property' ... – abarnert