したがって、クラスを作成し、そのクラス内で __init__() 関数の外で配列を宣言すると、その配列は (self.array として参照する必要があるにもかかわらず) クラス変数のように扱われるようです。ただし、__init__() 内で宣言するとインスタンス変数として扱われます。
明確にしておきますが、これは Rhino の問題ではなく、むしろ Python 言語の「機能」のようです (私が何か間違ったことをしていない限り)。したがって、この投稿は注意事項または役立つ情報です。私は数時間にわたって非常に困惑しました。これはカスタム イベントで発生したため、クラス間での関数の受け渡しか何かに関係があるのではないかと考えましたが、いいえ、(ハンドラーの) サブスクライバー リストはカスタム クラスの __init__ の外側で宣言された配列でした。したがって、1 つのインスタンスのイベントのみをサブスクライブした場合でも、すべてのインスタンスがイベントを起動します。
この問題を示す簡単な例を次に示します。これを実行すると、結果 (例の下に掲載) は、List1 が両方のインスタンスからの単語を追加することになるのに対し、List2 にはインスタンスごとに個別のリストがあることがわかります。
#! python3 class WordListCollection: # これはクラス変数として扱われます List1 = []
Name = “” def __init__(self): # これはインスタンス変数 self.List2 = として扱われます。 []
def AddWordsToList1(self, Words): 単語内の単語の場合: self.List1.append(word) def AddWordsToList2(self, Words): 単語内の単語の場合: self.List2.append(word) WLC1 = WordListCollection() WLC1.Name = “WordListCollection1” WLC1.AddWordsToList1([“apple”, “pear”, “banana”]) WLC1.AddWordsToList2([“Ford”, “Chevy”, “Dodge”]) WLC2 = WordListCollection() WLC2.Name = “WordListCollection2” WLC2.AddWordsToList1([“peach”, “cherry”, “apricot”]) WLC2.AddWordsToList2([“Mercury”, “Pontiac”, “Jeep”]) print(WLC1.Name) print(“List1”, WLC1.List1) print(“List2”,WLC1.List2) print(“”) print(“————–” ) print(“”) print(WLC2.Name) print(“List1”, WLC2.List1) print(“List2”, WLC2.List2)
結果:
WordListCollection1 リスト 1 [‘apple’, ‘pear’, ‘banana’, ‘peach’, ‘cherry’, ‘apricot’]
リスト2 [‘Ford’, ‘Chevy’, ‘Dodge’]
————– WordListCollection2 リスト 1 [‘apple’, ‘pear’, ‘banana’, ‘peach’, ‘cherry’, ‘apricot’]
リスト2 [‘Mercury’, ‘Pontiac’, ‘Jeep’]
#奇妙な #Python #配列の落とし穴 #またはPython #クラスの仕組みを知らなかった #スクリプト作成