2009-08-01 2 views

답변

34

'자기'변수를 교체하는 것이 달성 될 가능성은 당신이 무엇을 '

def func(obj): 
    obj.var_a = 123 
    obj.var_b = 'abc' 

그런 다음 이렇게 : 어떻게해야 func(self)

는 인스턴스의 변수를 변경하는 것입니다 func (self)의 결과를 다른 변수에 저장하여 수행 할 수 없습니다. 'self'는 효과적으로 메소드 호출 기간 동안 정의 된 지역 변수이며, 조작중인 클래스의 인스턴스를 전달하는 데 사용됩니다. self 대체는 실제로 다른 객체가 보유한 클래스의 원래 인스턴스에 대한 참조를 대체하지 않으며 할당 된 새 인스턴스에 대한 지속적인 참조를 생성하지 않습니다.

6

네, 변경하기 전에 다른 변수를 self으로 설정하지 않는 한, 클래스 A의 현재 인스턴스를 참조 할 수 없다는 것입니다.하지만 나는 그것을 권장하지 않습니다. 덜 읽을 수있는 코드를 만듭니다.

다른 변수와 마찬가지로 변수 만 변경한다는 점에 유의하십시오. self = 123을 수행하는 것은 abc = 123과 동일합니다. self은 메서드 내의 현재 인스턴스에 대한 참조 일뿐입니다. self을 설정하여 인스턴스를 변경할 수 없습니다.

class A: 
    def method1(self): 
     func(self) # No need to assign self here 
7

이 질문에 직접 대답이 아니라, 게시물 아래 무엇을 amirouche에 대한 해결책 거기는하려고 노력 :

을 그리고 여기에 코드를 작동하고 샘플 (Python 3.2.5).

class Men: 
    def __init__(self, name): 
     self.name = name 

    def who_are_you(self): 
     print("I'm a men! My name is " + self.name) 

    def cast_to(self, sex, name): 
     self.__class__ = sex 
     self.name = name 

    def method_unique_to_men(self): 
     print('I made The Matrix') 


class Women: 
    def __init__(self, name): 
     self.name = name 

    def who_are_you(self): 
     print("I'm a women! My name is " + self.name) 

    def method_unique_to_women(self): 
     print('I made Cloud Atlas') 


men = Men('Larry') 
men.who_are_you() 
#>>> I'm a men! My name is Larry 
men.method_unique_to_men() 
#>>> I made The Matrix 


men.cast_to(Women, 'Lana') 
men.who_are_you() 
#>>> I'm a women! My name is Lana 
men.method_unique_to_women() 
#>>> I made Cloud Atlas 

참고 self.__class__하지 self.__class__.__name__. 나는. 이 기술은 클래스 이름을 대체 할뿐만 아니라 실제로 클래스의 인스턴스를 변환합니다 (둘 다 최소한 id()). 또한, 1) "개체 자체의 방법으로 같은 유형의 다른 개체로 자체 개체를 대체하는 것이 안전한지"나는 모르겠다; 2) 동일한 유형의 객체뿐만 아니라 다양한 유형의 객체에서도 작동합니다. 3) 정확히 amirouche 원한처럼 작동하지 않습니다 : 당신은 Class(args), 오직 Class() (나는 프로가 아니고 왜 이런 식으로 대답 할 수 없어요)과 같은 클래스를 초기화 할 수 없습니다.

0

메소드의 자체 지정을 사용하여 인스턴스 클래스를 파생 클래스로 변경할 수 있습니다.

물론 새로운 객체에이 객체를 할당 할 수는 있지만 새로운 객체의 사용은 메소드의 나머지 코드를 통해 파급됩니다. 그것을 스스로 재사용하면 나머지 방법은 그대로 둡니다.

class aclass: 

    def methodA(self): 
     ... 
     if condition: 
      self = replace_by_derived(self) 
      # self is now referencing to an instance of a derived class 
      # with probably the same values for its data attributes 

     # all code here remains untouched 
     ... 
     self.methodB() # calls the methodB of derivedclass is condition is True 
     ... 

    def methodB(self): 
     # methodB of class aclass 
     ... 

class derivedclass(aclass): 
    def methodB(self): 
     #methodB of class derivedclass 
     ... 

그런 특수한 경우를 제외하고는 자기를 대체 할만한 장점이 없습니다.

5

내가 아는 한, 현재의 오브젝트를 멤버 함수에서 같은 유형의 다른 오브젝트 (오브젝트 유형을 변경하지 않을 것이라고 가정)로 대체하려고하는 경우. 이 목표를 달성 할 수 있다고 생각합니다.

class A: 
def method1(self): 
    newObj = func(self) 
    self.__dict__.update(newObj.__dict__) 
+0

는 매우 unpythonic 보이지만 나를 위해 일했습니다 - 고마워요! – alex314159

0

네, 아무 문제가 없습니다. 거만한 사람은 증오 할거야. (당신의 in most cases imaginable, there's no point in such reassignment and it indicates an error으로 Pycharm을 보았습니다.)

이 작업을 수행 할 수있는 상황은 다음과 같습니다

some_method(self, ...): 

    ... 

    if(some_condition): 
     self = self.some_other_method() 

    ... 

    return ... 

물론, 당신은 다른 변수에 self을 재 할당하여 메소드 본문을 시작할 수 있지만, 일반적으로 다른 parametres 이유와 그렇게하지 않는다면 self과 함께 하시겠습니까?

관련 문제