簡體   English   中英

如何在python中調用實例創建者的函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM