オブジェクト指向プログラミング(OOP)の重要な概念は、データとデータに対する操作をカプセル化して、相互に依存し、分割できない全体、つまりオブジェクトを形成することです。同じタイプのオブジェクトを抽象化した後、共通の特性が取得されてクラスClassが形成されます。
組み込みのデータ型、辞書、タプルなどのリストはすべてクラスです。Pythonを学ぶには、クラスに精通している必要があります。関連する概念から始めて、クラスを分類します。
1プロパティとメソッド
クラスとは、データとデータの操作方法をまとめたもので、データは変数に過ぎず、データの操作方法は関数にすぎません。これら2つはまとめてクラスメンバーと呼ばれ、関数はメンバーメソッドと呼ばれ、変数はメンバープロパティと呼ばれます。
2つのインスタンス属性とクラス属性
メンバー属性は、インスタンス属性とクラス属性に分けられます。
- インスタンス属性は通常、コンストラクター__init __で定義された属性を参照し、定義および使用するときに接頭辞selfを付ける必要があります。
- クラス属性は、クラス内のすべてのメソッドの外部で定義される変数です。
インスタンス属性はインスタンスによって決定されます。異なるインスタンスは異なるインスタンス属性にすることができますが、クラス属性はグローバルであり、各インスタンスのクラス属性は同じです。(インスタンス属性クラス属性との関係は、ローカル変数とグローバル変数の間の関係のようなものです)
class Car:
price = 10000 # 这是类属性, 定义在所有方法之外
def __init__(self, c):
self.color = c # 这是实例属性
クラス属性はグローバルであるため、クラス、属性、およびインスタンス属性を介してアクセスできますが、インスタンス属性はインスタンス属性を介してのみアクセスできます。
car1 = Car('red') #创建一个对象, 也叫做类的实例化 ,从人类 到具体的 “张三”
Car.price #类.属性访问
>>>10000
car1.price #实例.属性访问
>>>10000
Car.color
>>>AttributeError: type object 'Car' has no attribute 'color' # 实例属性不可以通过 类.属性 访问
car1.color
>>>'red'
isinstance(car1, Car) # 查看一个对象是否为某个类的实例
>>> True
クラス定義が完了すると、Pythonは次のようにメンバーを動的に追加または変更できます。
Car.company = "Volkswagen" # 增加成员属性
Car.price = 11111 # 修改成员属性
def setSpeed(self, s):
self.speed = s
import types
Car.setSpeed = types.MethodType(setSpeed, car1) # 增加成员方法
メソッドと関数の違いは、メソッドは通常、インスタンスに関連する関数を参照することです。メソッドを呼び出すときは、インスタンス自体が最初のパラメーターとして渡されます。したがって、メンバーメソッドを追加するときは、型を呼び出す必要があります。 .MethodType()を使用して、関数をメソッドに変換します。その後、クラスに追加できます。
属性
属性とメソッドは変数であり、もう1つは関数です。呼び出されると、括弧があります。メソッドは属性を付けることもできます。括弧なしで呼び出すことができます。
class Car:
price = 10000
def __init__(self, c):
self.color = c
def showcolor1(self):
return self.color
@property # 属性装饰器
def showcolor2(self):
return self.color
car = Car('red')
car.price # 访问属性
>>>10000
car.showcolor1() # 调用方法
>>>'red'
car.showcolor2 # 方法属性化
>>>'red'
dir(class_name)はクラス内のメソッドと属性を表示し、help(class.method)はメソッドの説明を表示します
dir(car)
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'color',
'price',
'showcolor1',
'showcolor2']
3公的および私的メンバー
データの機密性を確保するために、一部の変数をプライベート属性として設定する必要があります。これにより、クラスの外部、つまりプライベートメンバーからメソッドに直接アクセスできなくなります。その逆は、パブリックメンバーです。
- __x、Pythonで二重下線で始まるものはプライベートメンバーです
- _x、最初の単一の下線は保護されたメンバーであり、インポートを使用してインポートすることはできません。クラス内またはサブクラス内でのみ使用できます。
- x、両側に下線が付いているものは特別なメンバーです。
class Car:
__price = 10000
def __init__(self, c):
self.color = c
car = Car('red')
Car.__price
AttributeError: type object 'Car' has no attribute '__price'
car.__price
AttributeError: type object 'Car' has no attribute '__price' # 不管是实例还是类都不能访问私有成员
しかし、プログラムのテストとデバッグのために、Pythonはクラス外のプライベートメンバー「instance._class__privateattributes」にアクセスする方法を提供します。
car = Car('red')
car._Car__price
>>>10000 # 可以访问
4パブリックメソッド、プライベートメソッド、静的メソッド、クラスメソッド
パブリックメソッドとプライベートメソッドはどちらもインスタンスに属し(最初のパラメーターはself)、各インスタンスには独自のパブリックメソッドとプライベートメソッドがありますが、プライベートメソッドをインスタンスから直接呼び出すことはできません。プライベートメソッドは内部でのみ呼び出すことができます(または特別なメソッドを介して呼び出すことができます)。 Pythonの方法)。
class Car:
def __init__(self, c):
self.color = c
def __show(self): # 私有方法
print(self.color)
def setColor(self, newcolor): # 公有方法
self.color = newcolor
self.__show()
car1 = Car('red')
car1.__show()
>>>AttributeError: 'Car' object has no attribute '__show'
car1.setColor("bule")
>>>bule
プライベートメソッド__show()の場合、外部から呼び出されたときに非表示になって嘘をついていることがわかりますが、クラス内のパブリックメソッドsetColor()はself .__ show()を介して呼び出すことができます。
静的メソッドとクラスメソッドは、クラス名とインスタンス名で呼び出すことができますが、インスタンスメンバーに直接アクセスすることはできず、クラスメンバーのみにアクセスできます。これらはすべて一般的なメソッドです。
class Car:
price = 10000
def __init__(self, c):
self.color = c # 这是实例属性
@classmethod #类方法修饰器
def showprice(cls):
print(cls.price)
@staticmethod # 静态方法修饰器
def sayhello():
print('hello')
car1 = Car('red')
car1.showprice()
car1.sayhello()
>>>10000
>>>hello
注:クラスメソッドと静的メソッドはインスタンスに依存せず、インスタンスメンバーを呼び出すことはできません
演算子のオーバーロード
intクラスの追加とリストの追加に同じ符号「+」が付いているのに、操作方法が異なるのはなぜですか。これは、同じ演算子に対して、異なるクラスに対して定義された計算方法に対する演算子の過負荷です。
たとえば、Carクラスの場合、2台の車「+」を価格の合計として定義し、__ add__をオーバーロードします。
class Car:
def __init__(self, color, money):
self.color = color
self.money = money
def __add__(self, anothercar):
if isinstance(anothercar, Car):
return self.money + anothercar.money
else : print('this is nor a car ')
car1 = Car("red", 10000)
car2 = Car("bule",10000)
car1 + car2
>>>20000
継承
継承は再利用できるように設計されています。新しいクラスが必要な場合、新しいクラスが設計されたクラスのサブクラスである場合、サブクラスおよびサブクラスと呼ばれる設計されたクラスを直接呼び出すのは賢明で効率的な方法です。この動作は継承です。
たとえば、Carクラスの関数を継承できるVolkswagenクラスが必要になりました。
class Volkswagen(Car):
def setmodel(self, m):
self.model = m
car3 = Volkswagen( 'yellow', 100)
car3.color
>>>'yellow'
car3.money
>>>100 # 继承了负类的成员
car3.setmodel('迈腾')
>>>car3.model
'迈腾'
クラスのサブカテゴリを表示するには、issubclass(son、father)またはclass .__ bases__を使用して親カテゴリを表示できます。
issubclass(Volkswagen, Car)
True
Volkswagen.__bases__
(__main__.Car,)
コンテンツリファレンス:
Pythonプログラミング、Dong Fuguo、清華大学プレス
鳥のチュートリアルに参加Pythonオブジェクト指向