1

私は他のプログラミング言語に精通していますが、Pythonでのコードと、クラスを再割り当てしたときにクラスのプロパティがリセットされない理由を理解するのに苦労しています...例:通知クラスにメソッドがあります

def send(self):
    for service in self.hosts:
      # func = getattr(self, service)
      for host in self.hosts[service]:
        try:
          if service == 'xbmc':
            self.xbmc(host)
          elif service == 'growl':
            self.growl(host)
          elif service == 'prowl':
            self.prowl(host)
        except:
          print "Cound't connect " + host.find('ip').text + " For " + service

ご覧のとおり、これは各サービスを繰り返し処理します(したがって、3つのxbmcがあることに注意してください)

例としてxbmcを取り上げると、メソッドは次のようになります。

def xbmc(self, host):
  x = Xbmc(host)
  x.notify(self.title, self.message)

他の言語では、xを再度割り当てると、まったく新しい新しいオブジェクトになりますが、Pythonの場合はそうではないようです...

問題を説明するために、xbmcクラスからスニペットを配置します。

class Xbmc:
  hosts = []
  def __init__(self, host = None):
    self.setHosts(host)
    self.server = Hosts().getHostsByService('xbmcserver')

  def setHosts(self, host = None):
     ...alot of elif...
     elif type(host).__name__ == 'Element': # this code is the one that is in effect from my notify class
       self.hosts.append(host)
     ...more elif...
     print self.hosts # for debugging

コードがそこにあるので、送信する通知を開始します。出力は次のとおりです。

[<Element 'host' at 0x7fdda19d0d10>]
XBMC 192.168.1.10 Failed To Connect
[<Element 'host' at 0x7fdda19d0d10>, <Element 'host' at 0x7fdda1955090>]
XBMC 192.168.1.10 Failed To Connect
XBMC 192.168.1.20 Failed To Connect
[<Element 'host' at 0x7fdda19d0d10>, <Element 'host' at 0x7fdda1955090>, <Element 'host' at 0x7fdda19553d0>]
XBMC 192.168.1.10 Failed To Connect
XBMC 192.168.1.20 Failed To Connect
XBMC 192.168.1.21 Failed To Connect

ホストを追加すると、実際には新しいインスタンスになることはなく、すでに存在するものに常に追加されることは明らかです... x = Class()が新しいインスタンスを開始すると仮定しましたか?私が行った場合

self.hosts = [host]

それなら明らかに私は望ましくない効果を得ることができませんが、私の最初のアプローチがうまくいかない理由やそれを克服する方法を知っているのも良いでしょう。リセット方法が必要ですか?または、クラスから新しいインスタンスを作成する方法は実際にありますか?または私のコードに何か問題がありますか?ありがとう....

4

2 に答える 2

2

問題

この問題は、クラスプロパティhostsが可変(リスト)であるために発生します。そのため、それに追加すると、すべてのインスタンスに影響します。

解決

解決策は、クラスプロパティをインスタンスプロパティに変更することです。

class Xbmc:
    # <--- (no more "hosts" here)
    def __init__(self, host = None):
        self.hosts = []  # <--- we are initializing "hosts" property here now
        self.setHosts(host)
        self.server = Hosts().getHostsByService('xbmcserver')
    # and so on...
于 2012-10-10T00:15:24.103 に答える
0
class Xbmc:
  hosts = []
  def __init__(self, host = None):
    self.setHosts(host)
    self.server = Hosts().getHostsByService('xbmcserver')

する必要があります

class Xbmc:
  def __init__(self, host = None):
    self.hosts = []
    self.setHosts(host)
    self.server = Hosts().getHostsByService('xbmcserver')

最初のバージョンは、すべてのXbmcインスタンス間で共有されるリストを作成します。2つ目は、それぞれのリストを作成します。

于 2012-10-10T00:17:11.513 に答える