앞서 클래스 내에서 직접 접근할 수 없는 클래스의 프라이빗 속성에 대해 언급했습니다. 하지만 직접 액세스할 수 있는 속성이 공용 속성이면 어떻게 될까요? 설마. __init__() 생성자의 속성은 기본적으로 외부 세계에서 액세스할 수 있지만 공용 속성은 아닙니다. 그렇다면 공개 속성이란 무엇입니까?
정의: 이 클래스에 속하는 모든 객체가 액세스할 수 있는 속성을 말하며, 이를 공개 속성이라고 합니다.
class Person(object): def __init__(self, name, job, phone, address): self.name = name # 成员属性,属于某个实例对象 self.job = job self.phone = phone self.__address = address def get_private(self): return self.__address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj')
print(p1.job, p2.job) # 输出 Doctor Police
Person 클래스 아래에 p1과 p2라는 두 개의 객체를 정의했습니다. 분명히 p1이 p2의 작업 속성, 즉 경찰에 액세스할 수 있는 방법은 없습니다. 그런 다음 생성자 __init__()의 self.name과 같은 속성을 멤버 속성이라고 합니다.
class Person(object): nationality = 'CN' # 定义公有属性 def __init__(self, name, job, phone, address): self.name = name self.job = job self.phone = phone self.address = address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj') print(p1.nationality) print(p2.nationality) # 输出 CN CN
공개 속성에 관한 한, 이에 액세스하는 모든 인스턴스 객체가 얻는 값은 동일합니다.
공개 속성에 접근할 수 있을 뿐만 아니라 변경할 수도 있습니다.
class Person(object): nationality = 'CN' # 定义公有属性 def __init__(self, name, job, phone, address): self.name = name self.job = job self.phone = phone self.address = address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj') print(Person.nationality) # 调用 公有属性 Person.nationality = 'us' # 改变 公有属性 print(Person.nationality) #输出 CN us
# 依据上例 print("--------Befoer change---------") print(Person.nationality) print(p1.nationality) print(p2.nationality) print("--------after change---------") print(Person.nationality) p1.nationality = 'JP' print(p1.nationality) print(p2.nationality) # 输出
---------변경 전---------
CN
CN
CN
-- ------변경 후---------
US
JP
US
모든 사람이 Person 클래스의 public 속성을 nationality라고 부르기 때문에 p1을 수정하기 전에는 매우 잘 이해할 수 있습니다. p1과 p2의 국적 속성은 동일하며 둘 다 'CN'입니다. 그런데 p1이 public 속성을 수정한 후에도 p2의 국적 속성이 변경되지 않은 이유는 무엇입니까? Person 클래스를 정의하면 해당 클래스는 실제로 메모리에 존재하며 물론 이 클래스의 public 속성도 포함합니다. 초기 인스턴스 p1이 Person 클래스의 국적 속성을 호출할 때 국적이라는 새로운 속성을 추가하는 대신 클래스의 국적 메모리 주소를 직접 참조합니다.
아래와 같이
print(id(Person.nationality)) print(id(p1.nationality)) print(id(p2.nationality)) print(Person.nationality, p1.nationality, p2.nationality) #输出 1751236836128 1751236836128 1751236836128 CN CN CNPerson 클래스의 국적이 'US'로 변경되면 p2도 변경되는 이유를 설명할 수 있습니다. 메모리의 값을 직접 참조하기 때문입니다.
p1.nationality = 'JP'p1이 nationality 속성을 직접 할당한 후 인스턴스 p1은 실제로 nationality라는 새 멤버 변수를 자체에 추가합니다. 단지 이름은 같지만 둘 사이에는 아무런 연관성이 없으며 심지어 메모리 주소도 다릅니다.
# p1.nationality = 'JP' print(id(Person.nationality)) print(id(p1.nationality)) print(id(p2.nationality)) print(Person.nationality, p1.nationality, p2.nationality) #输出 2434579585096 2434579585152 2434579585096 US JP US따라서 p1.nationality='JP'는 Person 클래스의 공개 속성을 수정하지 않고 자체적으로 새 멤버 속성을 생성하므로 p1의 변경은 클래스의 공개 속성에 영향을 미치지 않습니다.
위 내용은 클래스의 공개 속성 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!