비공개 속성 은 ** 이중 밑줄 '__'**로 시작하는 속성입니다.
외부에서 개인 속성에 액세스하면 해당 속성이 없음을 나타내는 예외가 발생합니다.
프라이빗 속성은 외부에서 액세스 할 수 없지만 클래스 내부에서 액세스 할 수 있습니다. 개인 속성은 외부 오염으로부터 클래스 또는 인스턴스 속성을 보호하도록 설계되었습니다.
읽고 수정할 더 많은 개인 속성은 링크 설명 추가 를 참조하십시오.
인스턴스 개체의 개인 속성을 작동합니다.
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과 동일합니다.
인스턴스가 아닌 클래스에서 호출되기 때문에 클래스 메서드는 인스턴스 변수를 가져올 수없고 클래스 참조 만 가져올 수 있습니다.