まず第一に、魔法の方法は何ですか?
一つは、魔法の方法
1。概要
(1)pythonのメソッド名がxxx()の場合、特別な機能があるため、「マジック」メソッドと呼ばれます。
(2)実際、すべてのマジックメソッドは組み込みメソッド(str、delなど)を書き換えています)
1. __init __()メソッド
インスタンスの作成時に呼び出される初期化メソッドは、デフォルトでオブジェクトの作成時に呼び出されます。
__init __()メソッドには、デフォルトでselfという名前のパラメーターがあります。オブジェクトの作成時に2つのパラメーターが渡される場合、__ init __()メソッドには、最初のパラメーターとして「self」に加えて2つのパラメーターが必要です。__init __(selfなどの正式なパラメーター、x、y)。
以前は、次のようなオブジェクトに属性を追加しました。
class student:
pass
stu1 = student()
stu1.name = "tan"
stu1.age = 18
ここで、__ init __()メソッドを使用してコードを簡略化します
class student:
def __init__(self, name, age):
self.name = name
self.age = age
stu1 = Student("tan", 20)
このようにすると、コードはより簡潔になり、後の呼び出しでは2つのパラメーターを指定するだけで済みます。
2. str()メソッド
通常、オブジェクトを説明したり、出力する結果を定義したりするために使用されます。
str()を呼び出すと、__ str __()が呼び出されます。つまり、オブジェクトは文字列型に強制変換されます。
print()を使用してオブジェクトを出力すると、__ str __()メソッドも呼び出されます。__str __()メソッドを自分で定義している限り、このメソッドで返されるデータが出力されます。
__str __()メソッドが定義されていない場合:
class student:
def __init__(self, name, age):
self.name = name
self.age = age
stu1 = student("tan", 20)
print(stu1)
s = str(stu1)
print(s)
"""
出力結果:
< 0x012B23DCのメイン.studentオブジェクト>
< 0x012B23DCのメイン.studentオブジェクト>
"" "
__str __()メソッドが定義されていない場合、デフォルトでオブジェクトのメモリアドレスを返します。
__str __()メソッドが次のように定義されている場合:
class student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "name:%s \t age:%d"%(self.name, self.age)
stu1 = student("tan", 20)
print(stu1)
s = str(stu1)
print(s)
"""
输出结果:
姓名:tan 年龄:20
姓名:tan 年龄:20
"""
3. call()メソッド
クラスにcall()を設定すると、このクラスのインスタンスをメインプログラムの関数のように直接呼び出すことができます。x(a、b)はxを呼び出します。call(a、b)
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __str__(self):
return '<Book: %s>' % self.title
def __call__(self):
print('《%s》 is written by %s.' % (self.title, self.author))
if __name__ == '__main__':
pybook = Book('Core Python', 'Weysley')
print(pybook) # 调用__str__
pybook() # 调用__call__
4. del()メソッド
オブジェクトを削除するとき、Pythonインタープリターはデフォルトでメソッドを呼び出します。これは__del __()メソッドです。
まず、概念、つまりオブジェクト参照の数を理解する必要があります。オブジェクトへの参照の数を測定するには、sysモジュールにgetrefcount()が必要であり、戻り値=実際の参照の数+1です。2を返す場合は、オブジェクトの実際の参照数が1であることを意味し、この時点で、1つの変数がオブジェクトを参照しています。
import sys
class A:
pass
a = A()
###### 现在只有变量a引用了A类创建的对象
print(sys.getrefcount(a))
"""
出力結果:
2
"" "
次に、変数bを作成し、aによって参照されるオブジェクトも参照すると、その参照数は1増加し、実際の参照数は2になります。
b = a
print(sys.getrefcount(a))
"""
出力結果:
3
"" "
Pythonインタープリターは、このオブジェクトへの実際の参照数が0であることを検出すると、このオブジェクトを削除し、それに応じて__del __()メソッドが呼び出されます。もう1つの状況は、プログラムが完全に実行された後、対応するメモリが解放され、__ del __()メソッドも実行されることです。
これは、プログラムが正常に実行される場合の状況です。
import sys
class A:
def __del__(self):
print("该对象被销毁")
a = A()
"""
出力結果:
オブジェクトは破棄されます
"" "
変数参照を手動で削除する場合もあります。
import sys
class A:
def __del__(self):
print("该对象被销毁")
a = A() # 此时实际引用个数为1
b = a # 此时实际引用个数为2
print("删除了变量a")
del a # 删除变量a,此时实际引用个数为1
print("删除了变量b")
del b # 删除变量b,此时实际引用个数为0,python解释器就会删除该对象,即调用__del __()方法
print("程序结束")
"""
出力結果:
変数aがされ
、変数bが削除され、削除された
オブジェクトが破棄され、
プログラムが終了します
「」」
5.新しい()メソッド
•__new__は、クラスがインスタンスを作成するときに呼び出されるメソッドでもあり、__ init__よりも前に呼び出されます。
•__new__には、インスタンス化されるクラスを表すパラメーターclsが少なくとも1つ必要です。このパラメーターは、インスタンス化中にPythonインタープリターによって自動的に提供されます。
•__new__には、インスタンス化されたインスタンスを返すための戻り値が必要です。__new__を自分で実装する場合は、特に注意してください。インスタンスは、親クラス__new__から、またはオブジェクトの__new__から直接返すことができます。インスタンス。Python3では、すべてのクラスがデフォルトでオブジェクトの親クラスを継承します。
•__init__には、この__new__によって返されるインスタンスであるパラメータselfがあります。__init__は__new__に基づいて他の初期化アクションを完了することができ、__ init__は返す必要はありません。
class A:
def __init__(self):
print("调用了init方法")
def __new__(cls):
print("调用了new方法")
return super().__new__(cls)
a = A()
"""
出力結果:initメソッド"" "と呼ばれる
新しいメソッドが
呼び出されます
拡張:__ new__メソッドを次のように書き直すことで、シングルトンモードコードを実装できます。
class A:
# 定义一个私有的类属性,用于存储实例化出来的对象
_isinstance = None
def __new__(cls):
print("调用了new方法")
# 判断如果_isinstance为None,则创建一个实例,否则直接返回_isinstance
if not cls._isinstance:
cls._isinstance = super().__new__(cls)
return cls._isinstance
print(id(A))
print(id(A))
print(id(A))
print(id(A))
"""
出力結果:
154624
154624
154624
154624
"" "
6. Slots()メソッド
__slots __attributes pythonは動的言語であり、プログラムの実行中に属性を追加できることは誰もが知っています。インスタンスのプロパティを制限したい場合はどうなりますか?たとえば、Personインスタンスに追加できるのはname属性とage属性のみです。制限を達成するために、Pythonでは、クラスを定義するときに特別な__slots__変数を定義して、クラスインスタンスに追加できる属性を制限することができます。
class Result(object):
__slots__ = ("name", "age")
R = Person()
R.name = "tan"
R.age = 20
R.score = 100
"""
輸出輸出果:
トレースバック(最後の最後の呼び出し):
ファイル「」、6行目、
AttributeError:「Person」オブジェクトに属性「スコア」
「」がありません
注:__ slots__を使用する場合、__ slots__で定義された属性は現在のクラスインスタンスにのみ適用され、継承されたサブクラスには影響しないことに注意してください。