4.1 アクセス制限
前回のコラム: でPython基础
、著者は面向对象
プログラミングにおけるクラスとオブジェクトのプロパティを紹介しましたが、プロパティのアクセス レベルに応じて、一般プロパティとプライベート プロパティに分類できます。
通常、クラスやオブジェクトでは、プロパティ名が で始まる場合__
、そのプロパティはプライベート プロパティであることを意味し、通常の状況では、プロパティを外部から直接呼び出したり変更したりすることはできません。プロパティを非公開にすることで、 になります访问限制
。
アクセス制限はプログラムの堅牢性を高めるためのもので、特定の属性を外部から直接変更できないようにして、プログラムの通常の動作を保証します。
たとえば、クラスに年齢を格納するために使用される属性があり、この年齢属性を使用する必要があり、この年齢を除数として使用するメソッドがある場合、誤って年齢を 0 に設定または入力すると、プログラム エラーが発生します。
一部の重要な属性について、ユーザーが取得または変更できるようにしたい場合は、getage や setage などのカスタム メソッドを通じて実装できます。メソッドを通じてプロパティを設定すると、パラメーターをチェックして、間違ったパラメーターや無効なパラメーターを渡すことを回避できます。
定义私有变量
class Person:
def __init__(self):
self.name = 'lucy'
self.__age = 10
p = Person()
ic(p.name)
ic(p.__age)
17:09:42|> p.name: 'lucy'
トレースバック (最後の呼び出し):
ファイル "E:\t1.py"、12 行目、
ic(p.__age)
属性エラー: 'person' オブジェクトには属性 '__age' がありません
外部から直接属性を取得できることはわかりますname
が、属性を取得することはできません__age
。
通过方法获取属性
from icecream import ic
class Person:
def __init__(self):
self.name = 'lucy'
self.__age = 10
def getage(self):
return self.__age
p = Person()
ic(p.getage())
17:28:25|> p.getage(): 10
通过方法修改属性
from icecream import ic
class Person:
def __init__(self):
self.name = 'lucy'
self.__age = 10
def getage(self):
return self.__age
def setage(self, age):
if isinstance(age, int) and 0 < age < 150:
self.__age = age
else:
ic('输出的年龄有误,请核对!')
p = Person()
p.setage(20)
ic(p.getage())
p.setage(200)
ic(p.getage())
18:03:42|> p.getage(): 20
18:03:42|> '出力年齢が間違っています。確認してください!'
18:03:42|> p.getage(): 20
4.1.2 梱包
Python におけるカプセル化は、データと関連するメソッド (関数) を 1 つの単位として管理するために使用できるコード編成手法です。クラス内にパブリック メソッドを定義することで、クラス メンバー変数へのアクセスを制御し、不要な変更から変数を保護できます。
封装有以下作用:
- データを関連する動作とバンドルして、コードの管理とメンテナンスを容易にします。
- 特定の実装の詳細を非表示にして、コードをより安全で抽象的なものにします。
- 限られたインターフェイスのみを公開することで、コードの複雑さを軽減し、コードの可読性と保守性を向上させます。
- ソフトウェア モジュール間の相互運用性とコラボレーションが向上し、ソフトウェアの拡張性と柔軟性が向上しました。
Python では、特別な命名規則を使用してプライベート メンバーをエミュレートできます。名前の前に二重アンダースコア「__」を追加すると、他の人が誤ってメンバーにアクセスするのを防ぎ、クラスで定義されたパブリック メソッドを通じてのみアクセスできます。
class Car:
# 定义类私有变量
__max_speed = 0
__mileage = 0
def __init__(self):
# 初始化变量
self.__max_speed = 200
self.__mileage = 10
# 定义公共方法
def drive(self):
print('Driving. Max speed:', self.__max_speed)
# 定义getter和setter方法
def get_max_speed(self):
return self.__max_speed
def set_max_speed(self, speed):
self.__max_speed = speed
car = Car()
print(car.get_max_speed()) # 输出200
car.set_max_speed(250)
car.drive() # Driving. Max speed: 250
上記のコードでは、Car クラスは 2 つのプライベート変数 __max_speed と __mileage を定義しています。これらはクラス内でのみ使用できます。次に、クラスの外部からアクセスできるパブリック メソッド drive() を定義し、getter メソッドと setter メソッドを使用して変数 __max_speed の値を管理します。こうすることで、プライベート変数に直接アクセスせずに、パブリック インターフェイスを通じてクラスのデータとメソッドにアクセスできます。