>백엔드 개발 >파이썬 튜토리얼 >클래스의 공개 속성 소개

클래스의 공개 속성 소개

巴扎黑
巴扎黑원래의
2017-07-17 15:58:061580검색

1. 개념

앞서 클래스 내에서 직접 접근할 수 없는 클래스의 프라이빗 속성에 대해 언급했습니다. 하지만 직접 액세스할 수 있는 속성이 공용 속성이면 어떻게 될까요? 설마. __init__() 생성자의 속성은 기본적으로 외부 세계에서 액세스할 수 있지만 공용 속성은 아닙니다. 그렇다면 공개 속성이란 무엇입니까?

 정의: 이 클래스에 속하는 모든 객체가 액세스할 수 있는 속성을 말하며, 이를 공개 속성이라고 합니다.

2. 속성

2.1 멤버 속성

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과 같은 속성을 멤버 속성이라고 합니다.

2.2 공개 속성

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

 공개 속성에 관한 한, 이에 액세스하는 모든 인스턴스 객체가 얻는 값은 동일합니다.

 

3. 공개 속성의 특징

공개 속성에 접근할 수 있을 뿐만 아니라 변경할 수도 있습니다.  

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

  

3.1 단일 인스턴스 호출 및 공용 속성 변경

# 依据上例

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 CN

 Person 클래스의 국적이 '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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.