プライベート属性は、**二重下線 '__' **で始まる属性です。
外部からプライベートプロパティにアクセスすると、そのようなプロパティがないことを示す例外がスローされます。
プライベートプロパティには外部からアクセスできませんが、クラス内からアクセスできます。プライベート属性は、クラスまたはインスタンスの属性を外部の汚染から保護するように設計されています。
読み取りおよび変更するプライベート属性の詳細については、リンクの説明の追加を参照してください。
インスタンスオブジェクトのプライベートプロパティを操作する
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パラメータを明示的に渡す必要はありません。さらに、インスタンスメソッドを定義してプライベート属性を操作するこの方法をお勧めします。内部データの整合性を保護するだけでなく、この形式のデータカプセル化により、外部呼び出しの難しさを単純化することもできます。もちろん、インスタンスメソッドはプライベートプロパティだけのものではありません。インスタンスに関する詳細情報の出力など、クラスインスタンスに関連する操作をインスタンスメソッドに抽象化できます。
インスタンスオブジェクトのプライベートプロパティを操作するために、インスタンスメソッドを定義します。同様に、クラスのプライベートプロパティを操作する必要がある場合は、クラスのメソッドを定義する必要があります。
操作クラスのプライベートプロパティ
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()))
出力:
結果から、インスタンスメソッドを介してクラスのプライベートプロパティを使用すると、インスタンスメソッドを介してインスタンスオブジェクトのプライベートプロパティを使用するのと同じ効果があることがわかります。インスタンスオブジェクトがインスタンスメソッドを介してクラスプライベートプロパティを変更しない場合、インスタンスオブジェクトによって取得されるクラスプライベートプロパティの値は、クラスによって取得されるクラスプライベートプロパティの値になります。
インスタンスメソッドとは異なり、特別な注意が必要な2つのポイントがあります。
1.クラスメソッドは@classmethodでクラスメソッドとしてマークする必要があります。そうでない場合、定義はインスタンスメソッドのままです
。2。クラスメソッドの最初のパラメーターはクラス自体に渡されます。通常、パラメーター名はclsという名前です。上記のcls .__ localtionは、実際にはPerson .__ localtionと同等です。
インスタンスではなくクラスで呼び出されるため、クラスメソッドはインスタンス変数を取得できず、クラス参照のみを取得できます。