Pythonのベース - オブジェクト指向プログラミングのカプセル化、およびアクセス制限機構プロパティ

カプセル化のオブジェクト指向プログラミング

パッケージ

定義:。プロパティとメソッドの「オブジェクト」は、オブジェクトをカプセル化するので、オブジェクトのフェッチまたはストアデータの方法によって得ることができる落ちます。

役割:より簡単にデータにアクセスするメカニズムを持つオブジェクトを作成します「」。

# 定义类,调用类创建对象,这个过程可理解为封装
class Teacher:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    def score(self):
        print(f"{self.name}老师正在修改分数……")


tea = Teacher("lee", 27, "男")
print(tea.name, tea.age, tea.gender)
tea.score()

アクセス制限メカニズム

定義:クラス内のプロパティやメソッドは、で__始まり、制限され、外装缶ではない直接アクセス

このメカニズムは、プロパティとメソッドを非表示にするように見える__と同等の、で始まるプロパティまたはメソッド_类名__属性、または_类名__方法()

役割:プライベートデータ、隠され、容易ではない外取得します。

そして、他のプログラミング言語の違い:

他の言語は、アクセスを制限するために、民営化されています。しかし、Pythonで、隠されただけで、これはユニークな特徴のpythonであります

class Person:
    __name = "lee"
    __age = 18
    __gender = "男"

    def __init__(self, name, age, gender):
        self.__name = name
        self.__age = age
        self.__gender = gender

    def __userinfo(self):
        print(f"姓名:{self.__name},年龄:{self.__age},性别:{self.__gender}")


person = Person("dawn", 27, "男")
print(person.__name)  # 输出报错 AttributeError: 'Person' object has no attribute '__name'
person.__userinfo()  # 输出报错 AttributeError: 'Person' object has no attribute '__userinfo'

# 被__修饰的属性或者方法,可以通过 _类名__属性或_类名__方法名() 来访问
print(person._Person__name)  # 输出结果:dawn
person._Person__userinfo()  # 输出结果:姓名:dawn,年龄:27,性别:男

__現在のクラスで使用することができる修飾されたプロパティとメソッド

class A:
    def __fa(self):  # 4._A_fa()
        print('from A') # 5.最终输出的是就是 from A

    def test(self):  # 2.test(b) 虽然这里传入的是对象b
        self.__fa()  # 3.但是因为类的访问限制机制,这里强制换成成了 _A__fa()


class B(A):
    def __fa(self):  # _B__fa()
        print('from B')


b = B()
b.test()  # 1.对象b 和当前子类B 中都没有 test(),所以去父类A中查找

出力

from A

プロパティ

定義: Pythonは組み込みデコレータのための)(オブジェクトメソッド。に調整オブジェクトメソッド。プロパティと同様に取得するメソッドを呼び出します。

処置:いくつかのケースでは、この方法は、単純に処理されたデータを返します。それが簡単に発信者を使用するために作成するように類似の性質を呼び出す方法や手段に変更と呼ばれます。

class User:
    def __init__(self, weight, height):
        self.weight = weight
        self.height = height

    @property
    def bmi(self):
        return self.weight / (self.height ** 2)


# 创建user对象
user_obj = User(46, 1.56)
# bmi()方法使用了property装饰器,调用的时候,不加()
print(user_obj.bmi)  # 输出结果:18.902038132807363
# 调用时,加了(),相当于user_obj.bmi()()
print(user_obj.bmi()) # 报错 TypeError: 'float' object is not callable

プラス財産デコレータの後に、それのように、呼び出し元メソッドは、変更または削除するには、属性に簡単ですが、この方法は、オブジェクトを介してではありません。削除、変更するには。

呼び出し側が変更または削除するなどの属性を処理するようにすることができようにするためには、Pythonは提供@メソッド.setter名を装飾され、方法を変更するために、メソッド名.delter飾ら@ deleteメソッドへ

class User:
    def __init__(self, weight, height):
        # self.name = name
        self.weight = weight
        self.height = height
        self.__getbmi = self.weight / (self.height ** 2)

    @property  # 对象.bmi() ----→ 对象.bmi
    def bmi(self):
        return self.__getbmi

    @bmi.setter  # 允许修改 对象.bmi()中的值
    def bmi(self, value):
        self.__getbmi = value

    @bmi.deleter  # 允许删除 对象.bmi()中的值
    def bmi(self):
        del self.__getbmi


# 创建user对象
user_obj = User(46, 1.56)
# print(user_obj.bmi())  # 报错,user_obj.bmi() ----→ user_obj.bmi()()
print(user_obj.bmi)  # 输出结果:18.902038132807363
user_obj.bmi = 18  # 修改bmi 的值。
print(user_obj.bmi)  # 输出结果:18
del user_obj.bmi  # 删除bmi
print(user_obj.bmi)  # 报错,bmi 被删除了

おすすめ

転載: www.cnblogs.com/xiaodan1040/p/11946759.html