この章の内容: クラスとオブジェクトをシンプルかつわかりやすい方法で理解します。
関連するコードはすべてhttps://github.com/hzyao/Python-Cookbook
で参照できます。学びと練習を同時に行い、やがて発見できるのは素晴らしいことです。一緒に食べるとさらに美味しいかも!
クラスとオブジェクト
日常生活では、フォームをデザインし、作成し、フォームに記入することでデータを整理できます。来る!番組内の授業と比べてみましょう!
- デザインフォーム - デザインクラス(クラス)
- フォームの印刷 - オブジェクトの作成
- フォームに記入 - オブジェクト属性の割り当て
つまり、クラスを使用して属性をカプセル化し、クラスに基づいてオブジェクトを 1 つずつ作成して使用できます。
1 クラスとオブジェクト
クラス使用構文:
class 类名称:
类的属性
类的行为
对象 = 类名称()
"""
1. class是关键字,表示要定义类啦
2. 类的属性,即定义在类中的变量(成员变量)
3. 类的行为,即定义在类中的函数(成员方法)
"""
クラスの動作(メソッド)とは一体何でしょうか?
class Student:
name = None
age = None
def say_hi(self):
print(f"嗨大家好!我是{
self.name}")
Student.name = "run"
Student.age = 18
print(Student.name)
print(Student.age)
上記のことから、データを記録するためにクラスにプロパティを定義できるだけでなく、動作を記録するために関数も定義できることがわかります。で:
- クラス内で定義された属性 (変数) を「メンバー変数」と呼びます。
- クラス内で定義された動作 (関数) を「メンバーメソッド」と呼びます。
これからは、クラスメソッド内で定義された関数を呼び出します。
メンバーメソッド定義の構文:
クラス内のメンバー メソッドの定義は基本的に関数の定義と同じですが、微妙な違いがあります。
def 方法名(self, 形参1, ......, 形参N):
方法体
メソッド定義のパラメータリストにはキーワードがありself
、self
メンバメソッドを定義する際に入力する必要があります。これはクラス オブジェクト自体の意味を表すために使用され、クラス オブジェクトを使用してメソッドを呼び出すと、self
Python によって自動的に渡されます。メソッド内でクラスのメンバー変数にアクセスする場合は、 を使用する必要がありますself
。
注:self
キーワードはパラメータ リストに表示されますが、パラメータの位置を占めないため、パラメータを渡すときは無視できます。
class Student:
name = None
def say_hi(self):
print(f"Hello 大家好 我是{
self.name}")
def say_hi2(self, msg):
print(f"Hello 大家好 我是{
self.name} {
msg}")
stu1 = Student()
stu1.name = "run"
stu1.say_hi() # 调用的时候无需传参
stu1.say_hi2("很高兴认识大家!") # 调用的时候,需要传msg参数
stu2 = Student()
stu2.name = "xmy"
stu2.say_hi()
stu2.say_hi2("嘿嘿嘿!")
パラメータを渡すときは、self
透明であると言えますが、無視してください。パラメーターがmsg
違うんですね!
したがって、クラスメソッドとメンバーメソッドの定義構文は次のようになります。
class 类名称:
成员变量
def 成员方法(self, 参数列表):
成员方法体
对象 = 类名称()
クラスに基づいてオブジェクトを作成するための構文は であることを学びました对象 = 类名称()
。
では、なぜオブジェクトを使用する前にオブジェクトを作成する必要があるのでしょうか?
クラスはプログラム内の単なる「設計図」であり、適切に動作するには、その図面に基づいてエンティティ (つまり、オブジェクト) を生成する必要があります。このルーチンは「オブジェクト指向プログラミング」と呼ばれるもので、クラスを設計し、クラスに基づいてオブジェクトを作成し、オブジェクトを使用して特定の作業を完了します。
# 练习:设计一个闹钟类
class Clock:
id = None # 序列号
price = None # 价格
def ring(self):
print("beep")
clock1 = Clock()
clock1.id = "1220"
clock1.price = 9.99
print(f"id is {
clock1.id}, price is {
clock1.price}")
clock1.ring()
clock2 = Clock()
clock2.id = "0324"
clock2.price = 8.88
print(f"id is {
clock2.id}, price is {
clock2.price}")
clock2.ring()
2 コンストラクターを使用してメンバー変数に値を代入する
前回の研究では、オブジェクトのプロパティに順番に値を割り当てていましたが、少し面倒でした。実際には、これをより効率的な方法で行うことができます。関数のパラメータと同じようにプロパティに値を割り当てます。
Python クラスは、コンストラクター**__init__()**
と呼ばれるメソッドを使用できます。
- クラスオブジェクトの作成(クラスの構築)時に自動的に実行されます。
- クラス オブジェクトを作成する (クラスを構築する) 場合、受信パラメータは自動的に __init__ メソッドに渡されて使用されます。
# 构造方法的名称:__init__
class Student:
name = None
age = None
tel = None # 这些可以省略
def __init__(self, name, age, tel):
self.name = name
self.age = age
self.tel = tel
print("done")
stu = Student("run", 18, "0324")
print(stu.name)
print(stu.age)
print(stu.tel)
注: コンストラクターはメンバー メソッドでもあり、パラメーター リストで指定することを忘れないでくださいself
。コンストラクター内でメンバー変数を定義する場合は、キーワードを使用する必要がありますself
。
# 练习:学生信息录入
class Student:
def __init__(self):
self.name = input("请输入学生姓名:")
self.age = int(input("请输入学生年龄:"))
self.address = input("请输入学生地址:")
for i in range(1, 11):
print(f"当前录入第{
i}位学习信息,总共需录入10位学习信息")
stu = Student()
print(f"学生{
i}信息录入完成,信息为:【学生姓名:{
stu.name}, 年龄:{
stu.age}, 地址:{
stu.address}】")
3 その他の組み込みクラスメソッド
これらの組み込みクラス メソッドにはそれぞれ独自の特別な機能があるため、これらをマジック メソッドと呼びます。
魔法の方法はたくさんありますが、まずは一般的な方法だけを理解しましょう。例: __init__
(構築メソッド)、__str__
(文字列メソッド)、__lt__
(より大きい、より小さい記号の比較)、__le__
(以上、以下の記号の比較)、__eq__
(== 記号の比較) など。
3.1 str : 文字列メソッド
機能: クラスを文字列に変換する動作を制御します。
- メソッド名:
__str__
- 戻り値: 文字列
- 内容:自分でカスタマイズ
# __str__ 字符串方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
stu = Student("run", 18)
print(stu)
print(str(stu)) # 会输出内存地址
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"name:{
self.name}, age:{
self.age}"
stu = Student("run", 18)
print(stu)
print(str(stu))
3.2 lt : <、> 記号の比較
機能: 2 つのオブジェクトを直接比較することはできませんが、__lt__
クラスにメソッドを実装することにより、「大なり」記号と「小なり」記号の 2 つの比較を同時に完了できます。
- メソッド名:
__lt__
- パラメータを渡します:
other
、別のクラスオブジェクト - 戻り値:
True
またはFalse
- 内容:自分でカスタマイズ
# __lt__ 方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
stu1 = Student("run", 18)
stu2 = Student("xmy", 16)
print(stu1 < stu2) # False
print(stu1 > stu2) # True
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
stu1 = Student("run", 18)
stu2 = Student("xmy", 16)
print(stu1 < stu2) # 无法比较会报错
3.3ファイル: <=、>= 記号の比較
機能: 2 つの比較演算子 <= と >= に使用できます。
- メソッド名:
__le__
- 受信パラメータ: その他、別のクラス オブジェクト
- 戻り値:
True
またはFalse
- 内容:自分でカスタマイズ
# __le__ 方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self, other):
return self.age <= other.age
stu1 = Student("run", 18)
stu2 = Student("xmy", 16)
print(stu1 <= stu2) # False
print(stu1 >= stu2) # True
3.4 eq : == 記号の比較
機能: == 比較演算子で使用できます。
- メソッド名:
__eq__
- 受信パラメータ: その他、別のクラス オブジェクト
- 戻り値:
True
またはFalse
- 内容:自分でカスタマイズ
# __eq__ 方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
stu1 = Student("run", 18)
stu2 = Student("xmy", 18)
print(stu1 == stu2) # False
要約:
__init__
: コンストラクター メソッド。クラス オブジェクトの作成時に初期化動作を設定するために使用できます。
__str__
: クラス オブジェクトを文字列に変換する動作を実装するために使用されます。
__lt__
: 2 つのクラス オブジェクトの小さいか大きいかを比較するために使用されます。
__le__
: 2 つのクラス オブジェクトを以下か以上か比較するために使用されます。
__eq__
: 2 つのクラス オブジェクトが等しいかどうかを比較するために使用されます。