Python 액세스 제한 및 인스턴스 메서드, 클래스 메서드

비공개 속성 은 ** 이중 밑줄 '__'**로 시작하는 속성입니다.
외부에서 개인 속성에 액세스하면 해당 속성이 없음을 나타내는 예외가 발생합니다.
프라이빗 속성은 외부에서 액세스 할 수 없지만 클래스 내부에서 액세스 할 수 있습니다. 개인 속성은 외부 오염으로부터 클래스 또는 인스턴스 속성을 보호하도록 설계되었습니다.
읽고 수정할 더 많은 개인 속성은 링크 설명 추가 를 참조하십시오.

인스턴스 개체의 개인 속성을 작동합니다.

lass Person(object):

    def __init__(self, name, sex, age):
        self.__name = name
        self.__sex = sex
        self.__age = age

    def get_name(self):
        return self.__name
    
    def set_name(self, name):
        self.__name = name
        
    def get_sex(self):
        return self.__sex
    
    def set_sex(self, sex):
        self.__sex = sex
        
    def get_age(self):
        return self.__age
    
    def set_age(self, age):
        self.__age = age
        
    def get_info(self):
        print(self.get_name(), self.get_sex(), self.get_age())
        
xiaoming = Person('xiaoming', 'M', 20)
xiaoming.set_age(18)
xiaoming.get_info()
输出-->xiaoming M 18

인스턴스 메서드 는 클래스에 정의 된 함수를 의미합니다 . 인스턴스 메서드 의 첫 번째 매개 변수는 항상 self입니다. Self는 메서드를 호출하는 인스턴스 객체 자체에 대한 참조이며 다른 매개 변수와 일반 함수는 완전히 동일합니다.
인스턴스 메서드를 외부에서 호출 할 때 self 매개 변수를 명시 적으로 전달할 필요가 없습니다. 또한 인스턴스 메서드를 정의하여 private 속성을 운영하는이 방법을 권장하며, 이러한 형태의 데이터 캡슐화는 내부 데이터 일관성을 보호하는 것 외에도 외부 호출의 어려움을 단순화 할 수 있습니다. 물론 인스턴스 메서드는 전용 속성을위한 것이 아니라 인스턴스에 대한 자세한 정보를 인쇄하는 등 클래스 인스턴스와 관련된 작업을 인스턴스 메서드로 추상화 할 수 있습니다.

인스턴스 객체의 private 속성을 조작하기 위해 인스턴스 메서드를 정의합니다. 비슷하게 클래스의 private 속성을 조작해야하는 경우 클래스의 메서드를 정의해야합니다.

작업 클래스의 전용 속성

class Person(object):
    __count = 0

    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
        Person.__count += 1
        print("%i" % (Person.__count))

    '''@classmethod:类方法的标志'''
    @classmethod
    def getCount(cls): 
        return cls.__count

    @classmethod
    def setCount(cls, count):
        cls.__count = count

    def get_count(self):
        return self.__count

    def set_count(self, count):
        self.__count = count

xiaoming = Person('xiaoming', 'M', 18)

xin = Person('xin', 'F', 18)

print(xiaoming.name, xiaoming.sex, xiaoming.age)
print(xin.name, xin.sex, xin.age)

##下面这一行属于实例对象通过调用实例方法使用私有属性
xin.set_count(3)
print("the number of objects is %i" % (xin.get_count()))
print("the number of objects is %i" % (xiaoming.get_count()))
print("the number of objects is %i" % (xin.getCount()))
print("the number of objects is %i" % (xiaoming.getCount()))
'''注释的这一行执行报错,说明实例对象方法只能由实例对象调用,但是类方法既可以被类调用也可以被实例对象调用。'''
# print("the number of objects is %i" % (Person.get_count()))
print("the number of objects is %i" % (Person.getCount()))

print("类通过类方法使用私有属性")
Person.setCount(5)
print("the number of objects is %i" % (xin.get_count()))
print("the number of objects is %i" % (xiaoming.get_count()))
print("the number of objects is %i" % (xin.getCount()))
print("the number of objects is %i" % (xiaoming.getCount()))
print("the number of objects is %i" % (Person.getCount()))

출력 : 여기에 사진 설명 삽입
인스턴스 메서드를 통해 클래스의 private 속성을 사용하는 것은 인스턴스 메서드를 통해 인스턴스 객체의 private 속성을 사용하는 것과 동일한 효과를 나타냄을 알 수 있습니다. 인스턴스 객체가 인스턴스 메서드를 통해 클래스 전용 속성을 수정하지 않는 경우 인스턴스 객체가 얻은 클래스 전용 속성의 값은 클래스가 얻은 클래스 전용 속성의 값입니다.

인스턴스 메서드와 달리 특별한주의가 필요한 두 가지 사항이 있습니다.

1. 클래스 메소드는 @classmethod를 사용하여 클래스 메소드로 표시되어야합니다. 그렇지 않으면 정의는 여전히 인스턴스 메소드입니다
. 2. 클래스 메소드의 첫 번째 매개 변수는 클래스 자체로 전달됩니다. 일반적으로 매개 변수 이름은 cls입니다. 위의 cls .__ localtion은 실제로 Person .__ localtion과 동일합니다.
인스턴스가 아닌 클래스에서 호출되기 때문에 클래스 메서드는 인스턴스 변수를 가져올 수없고 클래스 참조 만 가져올 수 있습니다.

추천

출처blog.csdn.net/angelsweet/article/details/114537916