序文
この記事のテキストと写真はインターネットからのものであり、学習とコミュニケーションのみを目的としています。これらは商用目的ではありません。ご不明な点がございましたら、処理についてお問い合わせください。
PS:Pythonの学習教材が必要な場合は、以下のリンクをクリックして自分で入手できます
Pythonの無料学習資料とグループコミュニケーションの回答クリックして参加
インスタンス属性とクラス属性
次の例では、高さなどのDogクラスの属性は、ルバーブ、2つの黒などの特定の犬に属しています。それぞれに独自の高さがあります。
この種の属性はインスタンス属性と呼ばれ、通常、self.xxx = yyyを介してinitメソッドで作成されます。initで作成されたインスタンス属性の利点は、すべてのインスタンスがこれらのインスタンス属性を持つことです。
d1.nickname = '二黑子'のように、後続のコードにインスタンス名を追加することもできますが、このインスタンス属性は現在のインスタンスd1にのみ追加されます。他のインスタンスはありません。d2.nicknameにアクセスするとエラーが報告されます。
class Dog:
#构造方法
def __init__(self, name, height, power):
self.name = name
self.height = height
self.power = power
self.blood = 10
# --省略--
d1 = Dog('大黄', 0.7, 3) #创建第1个实例
d2 = Dog('二黑', 0.5, 4) #创建第2个实例
特定のインスタンスに属していないが、すべてのインスタンスで共有されている属性もいくつかあります。たとえば、犬の数の値は、特定の犬ではなく、犬のカテゴリ全体に属します。この種の属性はクラス属性と呼ばれます。
クラス属性を追加する
ここで、犬の数属性(num_of_dogs)をDogクラスに追加します。
クラス属性は、self.xxx = yyyの形式で作成することはできません。これは、インスタンス属性を作成するためです。
クラス属性を作成する方法は非常に単純です。クラスに直接書き込み、init関数に書き込み、selfを追加しないでください。
#类是一个模板
class Dog:
num_of_dogs = 0 # 类属性
#构造方法 - 添加实例属性,做其他的初始化工作
def __init__(self, name, height, power):
self.name = name
self.height = height
self.power = power
self.blood = 10
print(f"{self.name}出生了,汪汪!")
クラス属性を使用する
クラス属性はクラスに属し、クラス属性へのアクセスはクラス名を介して行われます。次のコードはいくつかのことを行います。
1.初期化関数は、新しい犬が作成されたら、num_of_dogsに1を加える。
2. A型()メソッドは、犬が亡くなったことを示すために追加される。ダイたら()が呼び出され、num_of_dogsは1だけ減少されます。
3.複数の犬を作成し、numer_of_dogsの変更数をテストし、30回ループし、犬をランダムに選択して、dieメソッドを呼び出します。
ここでは、ランダムモジュールランダムと、加算(+ =)および減算(-+)演算子が使用されます。これに慣れていない場合は、関連する知識を自分で追加するか、ディスカッショングループに参加してディスカッションしてください。
import random
#类是一个模板
class Dog:
num_of_dogs = 0 # 类属性
#构造方法 - 添加实例属性,做其他的初始化工作
def __init__(self, name, height, power):
self.name = name
self.height = height
self.power = power
self.blood = 10
print(f"{self.name}出生了,汪汪!")
Dog.num_of_dogs += 1
def die(self):
print(f"{self.name}已安息!")
Dog.num_of_dogs -= 1
# 创建100条狗,放到列表中
dogs = []
for i in range(100):
d = Dog(f"dog{i}", random.randint(30, 80), random.randint(1,12))
print(Dog.num_of_dogs)
dogs.append(d)
# 循环30次,每次随机选择一条狗,让它死掉
for i in range(30):
dog = random.choice(dogs)
dog.die()
print(Dog.num_of_dogs)
クラス属性をもう1つ追加します
犬が警察犬になることができるかどうかを判断したい場合、身長を使用して身長が60を超えるかどうかを判断します。この60は警察犬の標準です。この番号はすべての犬に共通であり、クラス属性です。
import random
#类是一个模板
class Dog:
num_of_dogs = 0 # 类属性
police_height = 60 # 成为警犬的身高标准
# --省略init和die方法
# 判定是否可以成为警犬,返回True或者False
def can_be_police(self):
return self.height > Dog.police_height
# 创建100条狗,放到列表中
dogs = []
for i in range(100):
d = Dog(f"dog{i}", random.randint(30, 80), random.randint(1,12))
print(Dog.num_of_dogs)
dogs.append(d)
print(f'成为警犬的身高标准是:{Dog.police_height}')
for d in dogs:
if(d.can_be_police()):
print(f'{d.name} 可以成为警犬')
コードの説明:
- police_heightクラス変数を追加しました
- 現在の犬が警察犬になることができるかどうかを判断するためのインスタンスメソッドを追加しました
- コードの下部に、警察犬になることができる犬の名前を印刷します
コード練習スキル
あなたは考えているかもしれませんが、この60をコードに直接書き込むことはできませんか?変数としても定義されていますか?
60という数字を直接書くことは不可能ではありませんが、多くの欠点があります。
- 複数の場所で使用されているため、間違っていて一貫性がない可能性があります。
- 基準が60から62に引き上げられると、多くの場所が改訂されます
- 変数として定義されているため、コードがわかりやすくなっています。そうしないと、60という数字が表示された場合、それが何を意味するのか理解できない可能性があります。
実際、polic_heightは通常変更されません。これを定数と呼ぶこともできます。
定数と変数に違いはありません。一般的に、定数の名前はすべて大文字であり、それ以上のものではありません。すべての大文字を見ると、この値は変更されないことがわかりますが、実際には変更できます。これは単なる慣例です。
ここでの「変更なし」という用語は、プログラムの実行中に動的に変更されないことを意味します。定数の値を60から62に変更することはコードの変更であり、いつでも行うことができます。
クラスメソッド
以前に定義されたメソッドを詳しく見てみましょう。これらにはすべて2つの特徴があります。
- メソッドの最初のパラメーターはselfです
- これらはすべてインスタンス変数を使用し、特定のインスタンスから分離されています。これらのメソッドは実行できず、意味がありません。
これらのメソッドは一般的ですが、実行中のプロセスはインスタンス変数に依存しているため、すべてインスタンスメソッドです。クラスのメソッドは、デフォルトではインスタンスメソッドです。
import random
#类是一个模板
class Dog:
num_of_dogs = 0 # 类属性
police_height = 60 # 成为警犬的身高标准
#构造方法 - 添加实例属性,做其他的初始化工作
def __init__(self, name, height, power):
self.name = name
self.height = height
self.power = power
self.blood = 10
print(f"{self.name}出生了,汪汪!")
Dog.num_of_dogs += 1
def die(self):
print(f"{self.name}已安息!")
Dog.num_of_dogs -= 1
# 判定是否可以成为警犬,返回True或者False
def can_be_polic(self):
return self.height > Dog.police_height
これらの3つのメソッドはすべてインスタンス属性に関連しており、すべてインスタンスメソッドです。
しかし、いくつかの方法は特定の例とは関係がなく、犬全体と関係があります。たとえば、メソッドdog宣言があり、その関数は次のとおりです。
- 犬の宣言を印刷する
- 犬の数を紹介します
コードを見てください:
import random
#类是一个模板
class Dog:
num_of_dogs = 0 # 类属性
police_height = 60 # 成为警犬的身高标准
#--省略--
# 类方法
@classmethod
def wangwang(cls):
print('我们是狗,我们是人类的朋友')
print('''
^..^ /
/_/\_____/
/\ /\
/ \ / \
''')
print(f'我们共有{cls.num_of_dogs}个成员')
# --省略--
Dog.wangwang()
コードの説明:
- クラスメソッドwangwang()を追加しました
- クラスメソッドの前に追加します:@classmethod。これはデコレータです。
- classメソッドの最初のパラメーターはclsです。これは、classの省略形であり、現在のクラスを表します。clsを使用して、クラス属性または他のクラスメソッドにアクセスします。
- クラス名を使用してクラスメソッドを呼び出します:Dog.wangwang()
静的メソッド
クラスメソッドはクラス属性に依存していることがわかります。一部のメソッドはインスタンス属性とクラス属性に依存せず、selfまたはclsを渡す必要はありません。これらのメソッドは静的メソッドです。
他にもいくつかの方法があるとします。犬の数などを印刷せずに、犬のキャラクターの絵を印刷するだけです。クラス属性またはインスタンス属性への依存関係はありません。
コードを見てください:
import random
#类是一个模板
class Dog:
num_of_dogs = 0 # 类属性
police_height = 60 # 成为警犬的身高标准
# --省略--
# 类方法
@classmethod
def wangwang(cls):
print('我们是狗,我们是人类的朋友')
print('''
^..^ /
/_/\_____/
/\ /\
/ \ / \
''')
print(f'我们共有{cls.num_of_dogs}个成员')
#静态方法:小狗的图像
@staticmethod
def pic_little():
print('''
/^ ^\
/ 0 0 \
V\ Y /V
/ - \
/ |
V__) ||
''')
#静态方法:大狗的图像
@staticmethod
def pic_big():
print('''
___
__/_ `. .-"""-.
\_,` | \-' / )`-')
"") `"` \ ((`"`
___Y , .'7 /|
(_,___/...-` (_/_/
''')
#静态方法:长的图像
@staticmethod
def pic_long():
print('''
.-.
(___________________________() `-,
( ______________________ /''"`
//\\ //\\
"" "" "" ""
''')
#--省略--
Dog.wangwang()
Dog.pic_little()
Dog.pic_big()
Dog.pic_long()
コードの説明:
- 3つの異なる犬の画像を印刷するための3つの静的メソッドを追加しました
- 静的メソッドの前には、デコレータである@staticmethodを付ける必要があります。
- 静的メソッドでは、selfまたはclsを渡す必要はありません。
- クラス名で静的メソッドを呼び出します。