2014-10-11 4 views
2

클래스의 모든 인스턴스에 함수를 적용하는 방법을 찾고 있습니다. 예 : 클래스의 모든 인스턴스에 함수 적용

class my_class: 

    def __init__(self, number): 
     self.my_value = number 
     self.double = number * 2 

    @staticmethod 
    def crunch_all(): 
     # pseudocode starts here 
     for instances in my_class: 
      instance.new_value = instance.my_value + 1 

그래서 명령 my_class.crunch_all() 기존의 모든 인스턴스에 새로운 속성 new_value을 추가해야합니다. 나는 이것을 "글로벌"기능으로 만들기 위해 @staticmethod을 사용해야 할 것이라고 추측합니다.

은 내가 my_class.instances을 통해 다음 루프를 __init__my_class.instances.append(number) 같은 것을 추가하고 의해 정의되고있는 인스턴스를 추적 할 수 알지만, 나도 지금까지 그와 운이 없었다. 또한 좀 더 일반적인 것이 있는지 궁금합니다. 이것은 가능한가?

하면
+3

이 있어야 '@classmethod'가 아니라'@ staticmethod'입니다. 그리고 네, 클래스 속성에서 클래스의 모든 인스턴스를 추적해야합니다. – jonrsharpe

답변

5

레지스터 초기화에서 클래스 개체 (즉 __init__)을하고 정의한 클래스 방법 (즉 @classmethod) 클래스에서 :

class Foo(object): 
    objs = [] # registrar 

    def __init__(self, num): 
     # register the new object with the class 
     Foo.objs.append(self) 
     self.my_value = num 

    @classmethod 
    def crunch_all(cls): 
     for obj in cls.objs: 
      obj.new_value = obj.my_value + 1 

예 :

>>> a, b = Foo(5), Foo(7) 
>>> Foo.crunch_all() 
>>> a.new_value 
6 
>>> b.new_value 
8 
+0

주목할 점은 파이썬에서는이 클래스 변수가 모든 인스턴스에서 액세스 할 수 있다는 것입니다. 'id (Foo.objs)','id (a.objs)'와'id (b.objs)'는 모두 같은 것을 가리키는 것을 볼 수 있습니다. 그러므로 누군가가 원한다면,'a.objs.append ("hello")'와 같이 불쾌한 일을 할 수 있고,'crunch_all'은 오류를 가지게 될 것입니다. 왜냐하면'objs'의 끝에있는 문자열은'my_value '속성을 사용하십시오. – ely

+0

'objs'의 내용이 변형되었을 때 발생합니다 (완전히 재 할당되었을 때'a__'와'else'에 대해서만'__setattr__' 시퀀스가 ​​발생합니다). 그래서'objs'를'tuple'로 간단하게 만들 수 있습니다. 그것은 변형 될 수 없으며, 생성자에서 이전 객체의 내용에서 새로운 '튜플 (tuple)'을 생성하고 인스턴스 생성중인 객체를 추가하는 것입니다. – ely

+0

이것은 유용한 질문입니다 : . – ely

관련 문제