2016-12-19 2 views
-4

У меня есть родительский класс, который имеет значения по умолчанию. Что все остальные объекты наследуют.Inherit vales from Parent class to Child class

class Parent(): 
    def __init__(self, a, b, x, y): 
     self.a = a 
     self.b = b 
     self.x = x 
     self.y = y 

class Child(Parent): 
    def __init__(self, a, b, x, y): 
     super().__init__(self, a, b) 
     self.x = x 
     self.y = y 

Я хочу Parent и Child имеют одинаковую a и b. Так что я не хочу писать все время:

v = Child(a,b,x,y) 

но:

v = Child(x,y) 
+0

Что вы ожидаете от 'a' и' b', если вы не передадите их? Предполагается ли python выбирать случайное число или строку или объект? –

+2

Когда вы выполняете наследование, у вас нет отношения родитель/ребенок. Если у вас есть класс «Собака» и подкласс «Пудель», «Пудель» не является дочерью «Собаки». –

+0

Ваши атрибуты 'a' и' b' (и 'x',' y' и 'z') не относятся к классам, а относятся к _instances_ классов, поэтому вы запрашиваете (« Я хочу родителя » и у ребенка такие же а и б ") не имеет смысла. –

ответ

2

Я предполагаю, что вы будете иметь несколько Parent() экземпляров, и что вы хотите создать Child() экземпляры, используя по умолчанию один тех.

Вы можете создать фабричный метод на родителя:

class Parent(): 
    def __init__(self, a, b, x, y): 
     self.a = a 
     self.b = b 
     self.x = x 
     self.y = y 

    def create_child(self, x, y): 
     return Child(self.a, self.b, x, y) 

child = parent.create_child(x, y) 

или дать Child метод фабрики класса:

class Child(Parent): 
    @classmethod 
    def from_parent(cls, parent, x, y): 
     return cls(parent.a, parent.b, x, y) 

и использовать это:

child = Child.from_parent(parent, x, y) 

Выберите метод которые наилучшим образом соответствуют тому, как ваш алгоритм должен создавать дочерние узлы.

Демонстрация последнего подхода:

>>> parent = Parent('foo', 'bar', 10, 20) 
>>> child = Child.from_parent(parent, 52, 1) 
>>> vars(child) 
{'a': 'foo', 'b': 'bar', 'x': 52, 'y': 1} 
+0

classmethod не работает. –

+0

@MarkoBerger: «не работает» ничего мне не говорит. Вы получаете исключение? Возвращает ли он неправильный результат? Какие? –

+0

from_parent() у вас есть 4 аргумента, и когда вы их вызываете, вы передаете их только 3. Итак, я получаю сообщение об ошибке –

0

Может быть, вы хотите использовать переменные класса тогда?

class Parent(): 
    a = 2 
    b = 3 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

class Child(Parent): 
    pass 

v = Child(x,y) 
-1

класса Parent, кажется, не имеют значения по умолчанию для атрибутов a и b. Я рекомендую вам внести это незначительное изменение в свой код, используя переменные класса

class Parent(): 
    a = 'foo' 
    b = 'bar' 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

class Child(Parent): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y