2016-04-12 2 views
1

мне нужно поставить что-то вроде этого в моей программеОбратитесь к классу вне его метода?

class the_class_name(Parent): 
    the_attribute = self.parent_class_method() 
    #the parent class method will return a value 
    #but I cannot use self here since there's no self 

Как я могу выполнить это? Есть ли другая альтернатива, которая может сделать эту работу для меня?

Я попытался с помощью __init__ вроде этого:

def __init__(self): 
    Parent.__init__(self) 
    self.attribute = self.the_method() 

Но тогда у меня есть проблемы при создании объекта, он не будет получать какие-либо параметры, которые Parent класс обычно получает больше

+2

Что вы хотите это сделать? Ваше намерение более двусмысленно, чем вы могли бы понять. – user2357112

+0

Мне нужно обратиться к методу родительского класса, и я хочу назначить возвращаемое значение атрибуту объекта прямо при создании объекта. –

+0

Какова реализация класса «Родительский»? –

ответ

0

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

super(ClassName, self).methodname(arg)

внутри метод

def child_method(self, arg): 
super(ClassName, self).methodname(arg) 

Вы не можете использовать self вне метода.

+0

Я попытался, но он дал мне ошибку «имя само не определено» –

+1

'self' is not потому что вы вызываете его вне функции, и экземпляр класса еще не инициализирован. Если вы расскажете нам больше о том, что вы на самом деле пытаетесь выполнить, показывая родительский класс, мы можем помочь. – Cyb3rFly3r

1

Похоже, вы ищете __init__:

class TheClassName(Parent): 
    def __init__(self): 
     # Set attribute to the result of the parent method 
     self.attribute = super(TheClassName, self).the_method() 

EDIT

Если родительский класс имеет параметры в своей собственной __init__ функции, включать их в дочернем классе:

class Parent(object): 
    def __init__(self, foo, bar): 
     ... 

    @classmethod 
    def the_method(cls): 
     ... 


class TheClassName(Parent): 
    def __init__(self, foo, bar): 
     super(TheClassName, self).__init__(foo, bar) 
     self.attribute = super(TheClassName, self).the_method() 

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

+0

Я попытался с помощью __init__ так: 'Защиту __init __ (Я): Родитель .__ INIT __ (Я) self.attribute = self.the_method()' Но у меня есть проблемы при создании объекта, он выиграл» t получать любые параметры, которые обычно получают родительский класс –

0

В этой точке создания подкласса нет self, а также нет экземпляра класса Parent. Это означает, что только методы класса Parent, которые вы могли бы назвать, должны быть либо статическими, либо методами класса.

Чтобы продемонстрировать:

class Parent(object): 
    @staticmethod 
    def static_method(): 
     return 42 

    @classmethod 
    def class_method(cls): 
     return 43 

class TheClassName(Parent): 
    the_attribute = Parent.static_method() 
    another_attribute = Parent.class_method() 

print(TheClassName.the_attribute) # -> 42 
print(TheClassName.another_attribute) # -> 43 
0

Вы должны использовать методы класса, объявленные с @classmethod декоратора или @staticmethod. Декоратор @classmethod предпочтительнее, так что наследование обрабатывается правильно, то есть метод вызывается в производном классе (немного техничности, если вы все еще это изучаете).

class Alpha(object): 
    @classmethod 
    def method1(cls): 
     return 'method1 has been called on {}'.format(cls) 


class Beta(Alpha): 
    def __init__(self): 
     self.myattr = Beta.method1() 


print(Beta().myattr) 

method1 has been called on class <'__main__.Beta'> 
Смежные вопросы