[英]How can you call a function of the creator of an instance, in python?
我有2個模塊,每個模塊包含一個類。
我的主程序實例化一個類的對象,它實例化了類Two的許多對象。
我需要能夠從類Two的實例中調用類One中的函數。
這是我所擁有的一般外觀:
模塊mod_one.py:
import mod_two
class One:
def __init__(self):
self.new_instance = Two()
def call_back_func(self):
# This function should be called
# from the new instance of class Two()
模塊mod_two.py:
class Two:
def __init__(self):
# Call call_back_func() of module mod_one
我發現的唯一方法是將回調函數call_back_func()作為類2的參數傳遞,如下所示:
self.new_instance = Two(self.call_back_func)
但我想知道是否有更好的方法可以做到這一點。
我認為簡單和松散耦合之間存在權衡。 在我看來,簡單性就是將回調傳遞給一個對象,而松耦合則是使用框架在對象之間傳遞信號。
例如,如果您使用blinker信號庫,則可以使用此替代設計:
from blinker import signal
class One:
def __init__(self):
self.two = Two()
self.two.some_signal.connect(self.callback)
def callback(self, data):
print 'Called'
class Two:
some_signal = signal('some_signal')
def process(self):
# Do something
self.some_signal.send()
one = One()
one.two.process()
在上面的代碼中, Two
對象甚至不知道是否有其他對象對其內部狀態更改感興趣。 但是,它會通過發出可能被其他對象(在本例中為One
對象)使用的信號來執行某些特定操作來通知它們。
這種方法的一個很好的例子是GUI框架。 創建按鈕小部件時,不需要傳遞應在單擊按鈕時執行的回調。 但是,該按鈕將發出單擊的信號,並且執行該信號所訂閱的任何回調都將執行所需的操作。
你在做什么是完全有效的。 注意__init__
不是構造函數。 它只是一種初始化方法。 ( __new__
是Python的構造方法)
關於這個主題的更多內容可以在問題Python中使用__new__和__init__找到?
我認為您在這里缺少一個對象。 特別是Creational Builder Pattern
class OneTwoBuilder:
def createOne(self, num_of_two=0):
o = One()
child = []
for _ in xrange(num_of_two):
t = Two()
o.callback(t)
child.append(t)
o.setChilds(child)
return o
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.