2014-09-11 2 views
0

Давайте предположим, что у меня есть два класса:Наследование переменной от суперкласса

#!/usr/bin/env python 

class First(): 

     glob = 'Global data' 

     def __init__(self, arg1, arg2): 
       self.arg1 = arg1 
       self.arg2 = arg2 
       print (arg1, arg2) 

class Second(First): 
     def __init__(self): 
       print (self.glob) 

И они вызываются из сценария, как:

#!/usr/bin/env python 

import classes 

data1 = 'First data part' 
data2 = 'Second data part' 

inst1 = classes.First(data1, data2) 
inst2 = classes.Second() 

Это работает, OK:

$ ./script.py 
('First data part', 'Second data part') 
Global data 

Я хочу сделать arg1 и arg2 в First классом что-то глобальное, и использовать его в Second:

class Second(First): 
     def __init__(self): 
       print (self.glob, self.arg1, self.arg2) 

Как я могу это достичь?

+0

Вы вводите в заблуждение * данные экземпляра * с данными класса * *. Атрибуты, заданные в '__init__'' First', являются атрибутами каждого экземпляра; экземпляры другого класса (даже подкласса) этого не видят. Какие значения имели бы экземпляры «Second» для этих атрибутов? –

+1

Вам придется называть 'First .__ init__' самостоятельно (поскольку вы переопределяете его в дочернем классе), возможно, с помощью функции' super'. После этого супервызова у вас будет доступ к этим атрибутам. – wim

ответ

1
class First(object): 

    glob = 'Global data' 

    def __init__(self, arg1, arg2): 
     self.arg1 = arg1 
     self.arg2 = arg2 
     #print (arg1, arg2) 

class Second(First): 
    def __init__(self, *args): 
     super(Second, self).__init__(*args) 
     print (self.glob, self.arg1, self.arg2) 

data1 = 'First data part' 
data2 = 'Second data part' 

inst1 = First(data1, data2) 
inst2 = Second(data1, data2) 
+0

Я думаю, что вопрос OP был python3 (просто догадка) – wim

+0

@wim Python 2.6.6 – setevoy

+0

'супер' - кажется, что мне нужно ... Спасибо, не знаю об этом. – setevoy

1

INIT из первых перегружен Во-вторых, вызвать один из ваших родителей класса с вашего второго класса

class Second(First): 
    def __init__(self): 
     super(Second, self).__init__("argument1", "argument2") 
     print (self.glob, self.arg1, self.arg2) 

В Python3 это так:

class Second(First): 
    def __init__(self): 
     super().__init__("argument1", "argument2") 
     print (self.glob, self.arg1, self.arg2) 
1

Вы можете использовать unpacking в своем First классе __init__() метод:

class First: 

    def __init__(self, *args): 
     for data in args: 
      print(data) 

# in your child class, you need to call First.__init__(), via super() 

class Second(First): 

    def __init__(self, *args): 
     super(Second, self).__init__(*args) # pass args to First.__init__() 

Использование:

import classes 

i = Second("data", "data1", "data2", "data3") 

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

class First: 

    def __init__(self, **kwargs): # note the double wildcards here 
     print(kwargs.get('data1')) 
     print(kwargs.get('data2')) 

class Second(First): 

    def __init__(self, **kwargs): 
     super(Second, self).__init__(**kwargs) 

# usage 

i = Second(data1="something", data2="something else", another_arg="Yahoo") 
Смежные вопросы