class my_class():
args1=1
def fun(self):
print self.args1
my_c=my_class()
my_c.fun()
请问在类里,那个self.args1 是类变量还是实例变量?类变量可以用self.args1用吗?
怪我咯2017-04-17 17:42:17
클래스 공간과 인스턴스 공간을 이해한다면 이 문제는 매우 간단할 것입니다. 클래스에는 고유한 네임스페이스가 있으며, 해당 내용은 className.__dict__
을 통해 확인할 수 있습니다. 동일한 방식으로 인스턴스를 인스턴스화하면 이 인스턴스는 인스턴스의 멤버, 메서드 등을 저장하는 데 사용되는 고유한 네임스페이스도 갖게 됩니다. 물론 인스턴스는 확실히 클래스의 멤버를 공유할 수 있습니다.
특히 귀하의 경우 print self.args1
인 경우 인스턴스의 네임스페이스 내부를 먼저 검색하고 args1
멤버를 찾을 수 없으므로 계속해서 클래스 공간을 찾고 args1을 찾습니다. 따라서 클래스의 args1을 출력합니다. 그러나 self.args1 = 1
과 같은 할당 문이 있는 경우 인스턴스는 자체 공간에 args1 멤버를 생성합니다. 아래 코드를 보세요:
위의 코드와 결합하면 상대적인 본질로 이해할 수 있을 것입니다
PHPz2017-04-17 17:42:17
클래스 변수는 클래스 객체의 ID를 직접 출력하여 확인할 수 있으며, self에 의해 제한되는 객체 ID가 동일한지 여부는 클래스의 주소와 객체 ID가 동일할 수 있는 이유입니다. Python이 기본적으로 인스턴스 변수를 먼저 검색하고, 찾을 수 없으면 클래스 변수를 찾기 때문에 객체 변수인 것처럼 보이지만 실제로는 클래스 변수를 참조합니다.
으아악자세히 살펴보면 사실 여기에서 self는 바인딩된 개체만 나타냅니다. 다른 변수 이름으로 이름을 지정할 수도 있습니다.
으아악