2016-07-02 7 views
-4

Я хочу, чтобы локальная переменная класса изменялась другим классом. Мой сценарий похож на следующий:Newbie Отладка кода Python

import datetime 
b = [] 


class P: 
    def __init__(self): 
     self.count = 1 
     self.create() 

    def create(self): 
     global b 
     a = C(self.count) 
     for i in range(10): 
      a.print_name() 
     print b 


class C: 
    def __init__(self, *data): 
     self.test = data[0] 

    @staticmethod 
    def print_name(): 
     global b 
     b.append(datetime.datetime.now()) 
o = P() 

Как избежать использования глобальной переменной. В Интернете я нашел, что использование «супер» может решить проблему. Пожалуйста, помогите в этом.

ответ

0

Сделать C конструктор принять P экземпляр. И вызовите метод P, чтобы добавить атрибут item к экземпляру объекта P.

class P: 
    def __init__(self): 
     self.count = 1 
     self.items = [] 
     self.create() 

    def append(self, item): 
     self.items.append(item) 

    def create(self): 
     a = C(self, self.count) # <-- Pass P instance (self) 
     for i in range(10): 
      a.print_name() 
     print self.items 


class C: 
    def __init__(self, p_instance, *data): 
     self.p_instance = p_instance # <-- Save P instance to use later 
     self.test = data[0] 

    def print_name(self): 
     self.p_instance.append(datetime.datetime.now()) # <-- Call p instance method 
0

Возможно, вы ищете атрибут класса. Если вы добавите b в качестве атрибута в класс C, к нему можно получить доступ как C.b и C().b, то есть от ссылки на класс или любой экземпляр.

class C(object): # classes in py2 should inherit from object! 
    b = [] # b inside C definition 

    @classmethod 
    def print_name(cls): 
     cls.b.append(datetime.datetime.now()) 

class P(object): 
    def __init__(self): 
    self.count = 1 
    self.create() 

    def create(self): 
    a = C(self.count) 
    for i in range(10): 
     a.print_name() 
    print C.b # or a.b 

Конечно, вы можете также разместить b на P. В этом случае делать

def print_name(): 
     P.b.append(datetime.datetime.now()) 

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

  • Нет связанных вопросов^_^