パッケージ、プロパティ特性とday22-クラスメソッドを結合および非結合方法

クラスのパッケージ

これらのプロパティとメソッドを隠すのクラスのプロパティやメソッドは、内部的に使用することができます外部で使用することはできません。実施段階にクラスのクラス定義の中にカプセル化、私有財産はします_xなります_类名__x

パッケージには2つのレベル

最初のレベル

第一レベルパッケージ(何もしない):作成したクラスとオブジェクトは、両方の名前空間がある作成され、我々は名前だけの内部にアクセスするためのクラス名またはOBJの方法を使用することができ、それ自体がパッケージの一種であります

セカンドレベル

第二レベル・パッケージ:(定義またはプライベートとして)プロパティおよびメソッドの一部を非表示にするクラスは、クラスではなく、外部からのアクセス内で使用されるか、または外部電源にアクセスするためのインタフェース(関数)の少量を残しています

隠し属性付きのpythonを達成するために二重下線方式(プライベートに設定)

class People:
    __name = 'nick'  # 设置成私有属性,在内部可以使用,在外部无法使用
    print(__name)  # nick
    
    def __sleep(self):
        print('from People')
    
    def eat(self):
        print('from eat')

peo = People()
peo.eat()  # from eat
peo.__name()  # 打印报错 'People' object has no attribute '__name'
peo.__sleep()  # 打印报错 'People' object has no attribute '__sleep'

あなたが使用するために、「_ __クラス名私有財産を」を通じてプロパティにアクセスできるようにしたい場合は

class People:
    __name = 'nick'
    
peo = People()
print(peo._People__name)
nick

メリットパッケージ

  • データのカプセル化:これはデータ隠蔽の目的ではありません。その後、我々は、データ属性の操作を厳密に制御を完了するために、添付のインタフェース上のデータの操作を制限することができ、データの外部ユーザインタフェースを提供し、その後隠し
  • 包装方法:目的は、複雑さを分離することです

プライベートモジュール

これは、モジュール内の私有財産や関数を定義したようなされています。_name = 'nick'モジュールをインポートする際にfrom module import *プライベート属性に_nameを導入することができない、インポートするために使用されますfrom module import _x

クラスのpropertry特性

使用中のデータ属性を装っに装飾する方法のための装飾的なプロパティが直接括弧を使用することはできません

# 没加property装饰器
class People:
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight
        
    def bmi(self):
        return self.weight/(self.height ** 2)
    
peo = People(1.8, 70)
print(peo.bmi())
21.604938271604937
class People:
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight
    
    @property  # 将装饰器后,将bmi函数伪装成一个数据属性
    def bmi(self):
        return self.weight/(self.height ** 2)
    
peo = People(1.8, 70)
print(peo.bmi)  # 不用加括号直接使用
21.604938271604937

セッターとデリータ

class People():

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

    @property  # 获取值的时候触发,你不需要加括号使用,不能加参数
    def bmi(self):
        return self.weight/(self.height**2)

    @bmi.setter  # 在修改bmi的时候触发,必须得加参数
    def bmi(self, value):
        print(f'不能修改成{value}')

    @bmi.deleter  # 在删除bmi的时候触发,不能加参数
    def bmi(self):
        print('delter')

peo = People(1.8,70)
print(peo.bmi)

print('*'*50)
peo.bmi = 50
print(peo.bmi)

print('*'*50)
del peo.bmi
print(peo.bmi)
21.604938271604937
**************************************************
不能修改成50
21.604938271604937
**************************************************
delter
21.604938271604937

オブジェクトクラスと非結合方法で結合させる方法

自己として関数に渡される最初の引数になります誰にバインド

class F:
    
    # 默认绑定给对象,只有对象能用,但是类也能使用,使用的时候必须得传参
    def f1(self):  
        print(self)
    
    # 绑定给类的方法,类能使用,对象也能使用,但是参数依然是类
    @classmethod  # 让被装饰的函数给类使用,约定俗成参数为cls
    def f2(cls):
        print(cls)
    
    # 什么都不绑定,非绑定方法,定义为普通的函数
    @staticmethod
    def f3(self):
        print(self)
    
f = F()
f.f1()  
F.f1(111)
print("*" * 30)

f.f2()
F.f2()
print("*" * 30)

f.f3('from f')
F.f3('from F')
<__main__.F object at 0x000001CE0E2EDFD0>
111
******************************
<class '__main__.F'>
<class '__main__.F'>
******************************
from f
from F

概要

  • オブジェクトの結合方法は:まさかバインド方法任意の装飾品を追加することではありません
  • クラスのメソッドを結合:結合法@classmethodデコレータの追加は次のようです
  • 未結合の方法:方法は、実際には、非結合アプローチである通常の機能を@staticmethodデコレータを追加しました

おすすめ

転載: www.cnblogs.com/863652104kai/p/11059352.html