Как получить доступ к переменным базового класса через экземпляр дочернего класса в Python? - PullRequest
2 голосов
/ 16 августа 2010

Я хотел бы узнать, как получить доступ к переменным суперкласса с помощью объекта дочернего класса. Если есть какой-то смысл, я добавляю, что некоторые переменные определены этим способом __variable name.В любое время я хочу получить доступ к переменным с дочерним объектом.Python говорит, что объект с типом CHILE CLASS TYPE здесь не определен.Я хотел знать, как я могу решить это?Я также хочу добавить, что суперкласс не определен явно, и он просто импортируется из модуля.

class AcuExcelSheet (  Worksheet  ):  ## super class which is imported from module 
    def __init__(self):
        Worksheet.__init__(self)

sheet = AcuExcelSheet()
for row_index in range(sheet.nrows):
        for col_index in range(sheet.ncols):
            print sheet.cell(row_index,col_index).value

для row_index в диапазоне (sheet.nrows): AttributeError: у объекта 'AcuExcelSheet' нет атрибута'nrows'

Я хочу знать о синтаксисе вызова этой переменной класса.Потому что я вижу, что атрибут nrow был определен в конструкторе класса Worksheet.

Ответы [ 3 ]

4 голосов
/ 16 августа 2010

Что-то не так, но не с кодом, который вы показали.Если Worksheet действительно определяет .nrows, тогда ваш AcuExcelSheet будет иметь к нему доступ.Есть несколько возможностей:

  1. Worksheet не определяет nrows.Вы упоминаете имена с двойным подчеркиванием.Вы уверены, что не __nrows?
  2. Worksheet определяет nrows, но только для некоторых путей кода, и ваш вызов конструктора не затрагивает эти пути кода.
2 голосов
/ 16 августа 2010

Простите, если я что-то неправильно понимаю, но разве дочерний класс не наследует автоматически методы суперкласса?Вот пример:

>>> class A(object):
...     def __init__(self):
...             self.data = "GIMME TEH DATA"
... 
>>> a = A()
>>> a.data
'GIMME TEH DATA'
>>> class B(A):
...     pass
... 
>>> b = B()
>>> b.data
'GIMME TEH DATA'

Таким образом, метод init суперкласса A устанавливает атрибут data.B является дочерним классом, и экземпляр B автоматически инициализирует тот же атрибут data.

Что я хочу сказать из этого, так это то, что эта часть мне кажется совершенно ненужной:

def __init__(self):
    Worksheet.__init__(self)

(В остальном я согласен с комментатором, что вам нужно либо использовать самоанализ, либо найти документацию, чтобы узнать, какие атрибуты Worksheet имеет - что-то вроде

>>> a = Worksheet()
>>> print dir(a)

.)

0 голосов
/ 17 августа 2010

В экземплярах объектов нет отдельного словаря экземпляров базового класса.В строке

Worksheet.__init__(self)

говорится, что объекты AcuExcelSheet инициализируются классом Worksheet.Все, что вам может понадобиться - чтобы получить доступ к методу базового класса, который был переопределен, вы можете сделать это просто выражением

super(AcuExcelSheet,self).method_name

.Поэтому, если вы не можете найти некоторые атрибуты в экземпляре дочернего класса, возможно, требуется дополнительная инициализация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...