나는이 같은 방법 안에 다른 인스턴스에 의해 개체 인스턴스를 교체하고 싶습니다 :메소드에서 동일한 유형의 다른 객체로 자체 객체를 바꾸는 것이 안전합니까?
class A:
def method1(self):
self = func(self)
개체가 데이터베이스에서 검색됩니다.
나는이 같은 방법 안에 다른 인스턴스에 의해 개체 인스턴스를 교체하고 싶습니다 :메소드에서 동일한 유형의 다른 객체로 자체 객체를 바꾸는 것이 안전합니까?
class A:
def method1(self):
self = func(self)
개체가 데이터베이스에서 검색됩니다.
'자기'변수를 교체하는 것이 달성 될 가능성은 당신이 무엇을 '
def func(obj):
obj.var_a = 123
obj.var_b = 'abc'
그런 다음 이렇게 : 어떻게해야 func(self)
는 인스턴스의 변수를 변경하는 것입니다 func (self)의 결과를 다른 변수에 저장하여 수행 할 수 없습니다. 'self'는 효과적으로 메소드 호출 기간 동안 정의 된 지역 변수이며, 조작중인 클래스의 인스턴스를 전달하는 데 사용됩니다. self 대체는 실제로 다른 객체가 보유한 클래스의 원래 인스턴스에 대한 참조를 대체하지 않으며 할당 된 새 인스턴스에 대한 지속적인 참조를 생성하지 않습니다.
네, 변경하기 전에 다른 변수를 self
으로 설정하지 않는 한, 클래스 A
의 현재 인스턴스를 참조 할 수 없다는 것입니다.하지만 나는 그것을 권장하지 않습니다. 덜 읽을 수있는 코드를 만듭니다.
다른 변수와 마찬가지로 변수 만 변경한다는 점에 유의하십시오. self = 123
을 수행하는 것은 abc = 123
과 동일합니다. self
은 메서드 내의 현재 인스턴스에 대한 참조 일뿐입니다. self
을 설정하여 인스턴스를 변경할 수 없습니다.
class A:
def method1(self):
func(self) # No need to assign self here
이 질문에 직접 대답이 아니라, 게시물 아래 무엇을 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()
(나는 프로가 아니고 왜 이런 식으로 대답 할 수 없어요)과 같은 클래스를 초기화 할 수 없습니다.
메소드의 자체 지정을 사용하여 인스턴스 클래스를 파생 클래스로 변경할 수 있습니다.
물론 새로운 객체에이 객체를 할당 할 수는 있지만 새로운 객체의 사용은 메소드의 나머지 코드를 통해 파급됩니다. 그것을 스스로 재사용하면 나머지 방법은 그대로 둡니다.
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
...
그런 특수한 경우를 제외하고는 자기를 대체 할만한 장점이 없습니다.
내가 아는 한, 현재의 오브젝트를 멤버 함수에서 같은 유형의 다른 오브젝트 (오브젝트 유형을 변경하지 않을 것이라고 가정)로 대체하려고하는 경우. 이 목표를 달성 할 수 있다고 생각합니다.
class A:
def method1(self):
newObj = func(self)
self.__dict__.update(newObj.__dict__)
는 매우 unpythonic 보이지만 나를 위해 일했습니다 - 고마워요! – alex314159
네, 아무 문제가 없습니다. 거만한 사람은 증오 할거야. (당신의 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
과 함께 하시겠습니까?
또한보십시오 : http://stackoverflow.com/questions/1015592/why-is-self-in-python-objects-immutable – ShreevatsaR