2014-12-08 2 views
1

моя структура класса - это что-то вроде этого.У экземпляра класса нет атрибута 'имя_функции' для передачи объекта за пределами класса-python

class A(): 
    def __init__(self): 
     self.matched_condition_set = set() 

    def add_to_matched_condition(self,condition): 
     self.matched_condition_set.add(condition) 

class B(): 
    def __init__(self, list_of_A): 
     self.list_of_a = list_of_A 

    def do_stuff(self): 
     for a in self.list_of_a: 
      if helper.check_for_a(a): 
       print(a.matched_condition_set) 

в файле helper.py У меня есть следующая функция.

def check_for_a(a): 
    print(type(a)) 
    a.add_to_matched_condition("hello") 
    return True 

Теперь, если я называю класс B объект, Я понимаю, что:

Экземпляр не имеет атрибута 'add_to_matched_condition'

. также, когда я пытаюсь получить тип >>print(type(a)) внутри вспомогательного метода. Я получаю тип < 'instance'>. где объект теряется?

+0

Что вы имеете в виду '' 'вызова класса B object'''? – wwii

+0

Работает для меня - '' 'a = A(); b = B ([a]); b.do_stuff() '' 'приводит к' '' '' 'и' '' set (['hello']) '' '. – wwii

ответ

1

Я не знаю, почему вы получаете A instance has no attribute 'add_to_matched_condition'; ваш код работает нормально для меня на Python 2.6.4

Чтобы получить более полезную подпись типа (плюс другие лакомства) на ваших классах, вам необходимо наследовать их от object.

Вот моя слегка измененная версия вашего кода, которая иллюстрирует это; он также показывает, как я тестировал ваши классы.

#!/usr/bin/env python 

import helper 

class A(object): 
    def __init__(self): 
     self.matched_condition_set = set() 

    def add_to_matched_condition(self,condition): 
     self.matched_condition_set.add(condition) 

class B(object): 
    def __init__(self, list_of_A): 
     self.list_of_a = list_of_A 

    def do_stuff(self): 
     for a in self.list_of_a: 
      if helper.check_for_a(a): 
       print(a.matched_condition_set) 


a1 = A(); a2 = A() 
b = B([a1, a2]) 

print a1, a2 
print b, b.list_of_a 

b.do_stuff() 

print a1.matched_condition_set 
print a2.matched_condition_set 

выход

<__main__.A object at 0xb758f80c> <__main__.A object at 0xb758f84c> 
<__main__.B object at 0xb758f86c> [<__main__.A object at 0xb758f80c>, <__main__.A object at 0xb758f84c>] 
<class '__main__.A'> 
set(['hello']) 
<class '__main__.A'> 
set(['hello']) 
set(['hello']) 
set(['hello']) 
1

Причина, по которой вы видите type<instance>, скорее всего, вы используете Python 2.x. Потому что вы определяете классы как

class A(): 

вместо

class A(object): 

вы создаете «старый стиль» классов.

Что касается вашей другой проблемы, нам нужно будет увидеть код, в котором вы создаете список A() s, и передать этот список в конструктор для B(). Пожалуйста, добавьте этот код, если вы хотите получить ответ на эту часть своего вопроса.

Кроме того, неясно, почему мне check_for_a не метод A(), и я не уверен, что я бы назвал функцию check_for_a, если он на самом деле имеет побочный эффект изменения объекта это проверка.

+0

Объявление класса классу A (объект): разрешено. но в чем разница между двумя типами? – shubham

+0

@shubham: см. Документы [NewClassVsClassicClass] (https://wiki.python.org/moin/NewClassVsClassicClass) и https://www.python.org/doc/newstyle/ –

Смежные вопросы