前回の記事 をご覧ください。主にオブジェクト指向の基本的な考え方や概念、プロパティやメソッドをクラスやインスタンスにバインドする方法について紹介しました。この記事では主にクラスデコレータ、継承、静的メソッド、クラスメソッドなどを紹介します。
1. クラスデコレータ
Python デコレーターはプログラム開発でよく使用される関数です。デコレーターを理解するには、まず次の点を明確にする必要があります。1. 関数デコレーターは
モジュールがインポートされるとすぐに実行され、デコレーター関数は明示的に呼び出された場合にのみ実行されます。
2. Python では、関数は特別な変数です。つまり、関数はパラメータとして他の関数に渡すこともできます。
デコレータについて知らない場合は、ここをクリックしてデコレータを表示してください。
# -*- coding:utf-8 -*-
class Hello:
def info(self, func):
func()
s = Hello()
@s.info
def f():
print("hello world!")
出力:
hello world!
上と同様: デコレータはインポートされるとすぐに実行され、f() はパラメータとして info の func パラメータに渡されます。
複雑なデコレータ:
# -*- coding:utf-8 -*-
import time
class Hello:
def info(self, f):
print("f:", f)
def second_func(func):
def thired_func(*args):
if f == "1":
new_time = time.strftime("%y-%m-%d", time.localtime())
elif f == "0":
new_time = time.strftime("%y-%m-%d", time.localtime())
print(func.__name__, *args, new_time)
return thired_func
return second_func
s = Hello()
@s.info("1")
def f(a, b):
print("hello world!")
f(1,2)
出力:
f: 1
f 1 2 20-04-30
同様に、@s.info("1") では、最初に 1 が info のパラメータとして info に渡され、次に f がパラメータとして Second_func に渡され、最後に (1, 2) がパラメータとして third_func にレイヤごとに渡されます。
2、不動産装飾者
プロパティ デコレーターは、クラスのメソッドをクラスのプロパティを呼び出すメソッドとして偽装できます。これは多くの場合に非常に便利で、簡潔で美しいコードを作成するのに役立ちます。
# -*- coding:utf-8 -*-
class Stu(object):
__name = "male"
__age = 0
@property
def age(self):
return self.__age
@age.setter
def age(self,v):
if not isinstance(v,int):
raise ValueError("值错误")
if v > 130 or v < 0:
raise ValueError("值错误")
self.__age = v
@age.deleter
def age(self):
print("删除用户数据")
m = Stu()
m.age = 100
print(m.age)
del m.age
出力:
100
删除用户数据
上記の age() メソッドなどの通常のメソッドに基づいて @property デコレータを追加します。これは get メソッドと同等で、値を取得し、「result = obj.age」のように実行するコードを決定するために使用されます。このメソッドには self パラメータが 1 つだけあります。同じ名前のメソッドを記述し、@xxx.setter デコレータを追加します (xxx は上記のメソッドと同じ名前を意味します) (例の 2 番目のメソッドなど)。これは、「obj.age = ...」のようなステートメントに対して実行するコードを決定する代入関数を提供する set メソッドを記述することと同じです。同じ名前の別のメソッドを作成し、@xxx.delete デコレーターを追加します (例の 3 番目のメソッドなど)。「del obj.age」などのステートメントによって実行されるコードを決定する関数を削除するために使用されます。
3. 継承
継承: つまり、派生クラス (派生クラス) は、基底クラス (基底クラス) のフィールドとメソッドを継承します。クラスが定義され、既存のクラスを継承する場合、新しいクラスはサブクラスと呼ばれ、継承されたクラスは基本クラス、親クラス、またはスーパークラス (基本クラス、スーパークラス) と呼ばれます。継承の利点: コードの再利用。継承は単一継承と多重継承
に分けられます。
3.1 単一継承
単一継承とは、次のような親クラスを 1 つだけ継承することを指します。
# -*- coding:utf-8 -*-
# 类定义
class People:
# 定义基本属性
name = ""
age = 0
__weight = 0
# 构造方法
def __init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说:我目前年龄 %d 正在学PY" %(self.name, self.age))
# 单继承
class Stu(People):
grade = ""
def __init__(self, n, a, w, g):
People.__init__(self, n, a, w)
self.grade = g
# 重写父类的方法
def speak(self):
print("%s说:我目前年龄%d正当学PY,我目前是%s年级" % (self.name, self.age, self.grade))
p1 = Stu("lyy", 15, 120, "2")
p1.speak()
p2 = People("md", 45, 75)
p2.speak()
出力:
lyy说:我目前年龄15正当学PY,我目前是2年级
md 说:我目前年龄 45 正在学PY
サブクラス Syu は、親クラス People のメソッドを継承します。
3.2 多重継承
多重継承とは、複数の親クラスを継承することを指します。多重継承の場合に注意しなければならない問題の 1 つは、継承の順序です。継承の順序を理解する前に、深さ優先と幅優先という 2 つの概念を理解する必要があります。
py2.x バージョンでは、従来のクラスは深さ優先の順序で処理され、
新しいスタイルのクラスは幅優先の順序で処理されます。
class BaseClass(object):
def show(self):
print('BaseClass')
class SubClassA(BaseClass):
def show(self):
print('Enter SubClassA')
super().show()
print('Exit SubClassA')
class SubClassB(BaseClass):
def show(self):
print('Enter SubClassB')
super().show()
print('Exit SubClassB')
class SubClassC(SubClassA):
def show(self):
print('Enter SubClassC')
super().show()
print('Exit SubClassC')
class SubClassD(SubClassB, SubClassC):
def show(self):
print('Enter SubClassD')
super().show()
print('Exit SubClassD')
d = SubClassD()
d.show()
継承関係は次の図に示すようになります。
出力:
Enter SubClassD
Enter SubClassB
Enter SubClassC
Enter SubClassA
BaseClass
Exit SubClassA
Exit SubClassC
Exit SubClassB
Exit SubClassD
[<class '__main__.SubClassD'>, <class '__main__.SubClassB'>, <class '__main__.SubClassC'>, <class '__main__.SubClassA'>, <class '__main__.BaseClass'>, <class 'object'>]
順序は DBCA-BaseClass です。
次のように SubClassD 継承の順序が変更された場合、class SubClassD(SubClassC, SubClassB):
アクセス順序は DCAB-BaseClass の
出力になります。
Enter SubClassD
Enter SubClassC
Enter SubClassA
Enter SubClassB
BaseClass
Exit SubClassB
Exit SubClassA
Exit SubClassC
Exit SubClassD
[<class '__main__.SubClassD'>, <class '__main__.SubClassC'>, <class '__main__.SubClassA'>, <class '__main__.SubClassB'>, <class '__main__.BaseClass'>, <class 'object'>]
4. 静的メソッド
静的メソッド: @staticmethod で装飾された自己パラメータのないメソッドは静的メソッドと呼ばれます。クラスの静的メソッドはパラメータを持たず、クラス名を使用して直接呼び出すことができます。
注
1. 静的メソッドはインスタンス変数を呼び出すことができません。
2. 呼び出すときにクラスやインスタンスを渡す必要はありません。クラスの外で定義する関数と同様ですが、静的メソッドはクラスまたはインスタンスを通じて呼び出すことができます。
class Eat:
name = "jsonwong"
age = 18
@staticmethod
def func():
print('hello world!')
eat = Eat()
eat.func()
出力:
hello world!
5、クラスメソッド
クラスメソッドは @classmethod デコレータを使用して実装されます。
注
1. クラス メソッドはクラス変数にのみアクセスでき、インスタンス変数にはアクセスできません。
2. 現在のクラス オブジェクトをインスタンス化せずに cls パラメーターを介して渡し、クラス オブジェクト [インスタンス名.メソッド名] およびクラス オブジェクト インスタンス [クラス名.メソッド名] を介して直接アクセスします。
class Eat:
name = "jsonwong"
food = "牛肉"
def __init__(self, food):
self.food = food
@classmethod
def func(cls):
print('hello world!', cls.food)
eat = Eat("羊肉")
eat.func()
出力:
hello world! 牛肉
上記のとおり、クラス メソッドはクラス変数にのみアクセスでき、インスタンス変数にはアクセスできないことに注意してください。
6. クラスの独自メソッド
独自のメソッド名 | 説明 |
---|---|
_初期化_ | オブジェクトの生成時に使用される構築方法 |
_ / _ | オブジェクトを解放する際に使用する解析機能 |
_辞書_ | ディクショナリ、レコードクラスの属性情報 |
_レン_ | 長さを取得する |
_さん_ | メソッドクエリ |
_ str _ | ユーザーに見せる |
_代表者_ | パーサーに見せる |