魔法のいくつかの一般的な方法のpython


まず、それを行うための魔法の方法は何ですか?Pythonでメソッド名()は、そのように「マジック」メソッドと呼ばれる特殊な機能があり、__ __xxxxある場合。

__ __ init()メソッド

  • インスタンスが作成されたときにオブジェクトを作成するときにデフォルトで呼び出される初期化メソッド呼び出し、。
  • __ __ init()メソッドは、自己パラメータ二渡されたパラメータは、オブジェクトを作成する場合、__init __()メソッドは、他の最初のパラメータは、2つの外部パラメータを必要とするように自己、例えばデフォルト名を持ちます__init __(自己、X、Y)。

我々はオブジェクトにこの属性を追加する前に:

class Student:
	pass
	
stu1 = Student()

stu1.name = "张三"
stu1.age = 18

今、私たちはコードを簡素化するために__init __()メソッドを使用します

class Student:
	def __init__(self, name, age):
		self.name = name
		self.age = age
	
stu1 = Student("张三", 18)

それは、より簡潔なコードを見てではありません

__str __()メソッド

  • 一般的なオブジェクトの説明、又は所望の出力の独自の定義の結果。
  • (__ __str STR()の呼び出し)を呼び出すとき、すなわち、オブジェクトが文字列型にキャストされます。
  • 彼らは__strを定義したとおりである__()メソッドを限りも()メソッド__ __strと呼ばれるオブジェクトの印刷()の出力を、使用する場合は、このメソッドの戻り値のデータを印刷します。

__str __()メソッドが定義されていない場合:

class Student:
	def __init__(self, name, age):
		self.name = name
		self.age = age
	
stu1 = Student("张三", 18)
print(stu1)

s = str(stu1)
print(s)

"""
输出结果:
<__main__.Student object at 0x03C3BCD0>
<__main__.Student object at 0x03C3BCD0>
"""

定義されていません__str __()メソッドそのリターンオブジェクトのデフォルトのメモリアドレス。
定義された__str __()メソッドは、そのようなものです:

class Student:
	def __init__(self, name, age):
		self.name = name
		self.age = age
	def __str__(self):
		return "姓名:%s\t年龄:%d"%(self.name, self.age)
	
stu1 = Student("张三", 18)
print(stu1)

s = str(stu1)
print(s)

"""
输出结果:
姓名:张三	年龄:18
姓名:张三	年龄:18
"""

__del __()メソッド

オブジェクトが削除された場合、Pythonインタプリタは、メソッド呼び出しにデフォルト設定されます、この方法は、__del __()メソッドです。
まず、それは最初のコンセプトを理解しておく必要があり、それは、オブジェクトの数への参照です。我々は、SYSモジュールGETREFCOUNT()が参照オブジェクトの数、測定するために使用される必要があり、戻り値= +1参照の実際の数オブジェクトの数が1への言及は、そのオブジェクトへの参照がある場合、実際のリターンを説明するための図2は、可変です。

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 __()メソッドが存在するであろう、削除されます。別の場合には、__対応するメモリが解放され、その後、それは__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
该对象被销毁
程序结束
"""

__new __()メソッド

  • __new __インスタンスが作成されるときに、クラスメソッドが呼び出されると、それ以前の時間よりも__通話を__init。
  • __new CLS __少なくとも1つのパラメータ、インスタンス化されるクラスの代表は、このパラメータは自動的にインスタンスにPythonインタプリタによって提供されます。
  • __new __アウト__new__、または直接__new__のうちの目的である、に自分の__new__有料特別な注意を達成するために、戻り値、そのインスタンスをインスタンスに戻り、この時点を持っている必要があります親クラスのインスタンスを返すことができますインスタンス。python3では、オブジェクトの各クラスは、デフォルトの親クラスを継承します。
  • パラメータ__init__自己、ノーリターン値init__ __、__ init__は基底__new__に他のいくつかの初期化操作を行うことができ、戻り__new__の一例です
class A:
    def __init__(self):
        print("调用了init方法")

    def __new__(cls):
        print("调用了new方法")
        return super().__new__(cls)
a = A()

"""
输出结果:
调用了new方法
调用了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))
"""
输出结果:
19888488
19888488
19888488
19888488
"""

__slots __プロパティ

我々は、すべてのプログラムの実行中にプロパティを追加することができ、そのPythonは、動的言語である知っています。我々はインスタンスのプロパティを制限したい場合はどうしますか?例えば、Personインスタンスの属性の名前のみと年齢を加えます。
先の時間制限に達するために、Pythonはクラス時間の定義を可能にする、クラスのインスタンスの属性を制限する特別な⼀__slots__変数の定義を追加することができます。

class Person(object):
	__slots__ = ("name", "age") 
P = Person() 
P.name = "⽼王" 
P.age = 20 
P.score = 100 

"""
输出结果:
Traceback (most recent call last):
  File "<input>", line 6, in <module>
AttributeError: 'Person' object has no attribute 'score'
"""

注:使用__slots__注意を払う、サブメニューのクラス継承の使用からクラスの唯一の現在のインスタンスの__ slots__定義された属性は、使用の仕事ではありません。

公開された44元の記事 ウォンの賞賛8 ビュー2473

おすすめ

転載: blog.csdn.net/qq_39659278/article/details/99706135