Pythonの基本:ダブルダウンメソッド

1.二重法

定義:ダブルアンダーメソッドは特別なメソッドです。ダブルアンダースコア、メソッド名、ダブルアンダースコアメソッド名によって提供される特別な意味を持つメソッドです。ダブルアンダーメソッドは主にPythonソースプログラマーによって使用されます。開発に最善を尽くしますダブルダウン方式を使用しないでください。ただし、ダブルダウン方式の詳細な調査は、ソースコードを読み取るのに役立ちます。

(1)呼び出し:ダブルダウンメソッドごとにトリガーメソッドが異なり、

<1> __ len__ – len()トリガー

class A(object):

    def __init__(self,name):
        self.name = name
        print("触发了__init__")

    def __len__(self):     # len() 触发
        print("走这里")
        return len(self.name)    # return len("xqrqwr")  str中__len__
        # 必须有返回值,返回值的类型必须是整型

a = A("xqrqwr")
print(len(a))

# str
a = "12345"      # str这个类的实例
lst = [1,2,3,4,4,5,5,5,5] # list这个类的实例
print(len(a))
print(len(lst))

<2> __ hash__ --hash()トリガー

class A(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __hash__(self):  # hash()
        hash({1,2,345})  # 可变数据类,不可数据类型
        return 1
        # 必须有返回值,返回值的类型必须是整型

a = A("meet",25)
print(hash(a))

<3> __ str__ --printまたはstr()トリガー

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:

    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __str__(self):   # print 触发 str()
        print(111)
        return f"姓名:{self.name} 年龄:{self.age} 性别:{self.sex}"
        # 必须有返回值,返回值的类型必须是字符串


a = A("mee",20,"男")
a1 = A("mee1",200,"男1")
str(a)
print(a)
print(a1)


# 以下对比:
a = A("mee",20,"男")
a1 = A("mee2",200,"女")

print(f"姓名:{a.name} 年龄:{a.age} 性别:{a.sex}")   # "姓名:meet 年龄:20 性别:男"
print(f"姓名:{a1.name} 年龄:{a1.age} 性别:{a1.sex}")  # "姓名:meet2 年龄:200 性别:女"

<4> __ repr__ --printまたは%rトリガー

class A:

    def __init__(self):
        pass


    def __repr__(self):   # print触发  %r
        print(1111)
        return "天魔"

    def __str__(self):   # str 优先级高于 repr  两个都存在就只执行str
        return "小元"

a = A()
print("%r"%(a))

<5> __ call__-オブジェクトが呼び出されたときにトリガーされ、オブジェクトの後にブラケットが付きます:オブジェクト()またはクラス()()

class A:

    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):  # 对象()时调用的__call__
        print("走我")
        print(*args, **kwargs)

a = A()
a()

<6> __ eq__等しい

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __eq__(self, other):     #  a == a1
        if self.name == other.name:
            return True
        else:
            return False

a = A("mee",56)
a1 = A("mee",108)

print(a == a1)

<7> __ del__コンストラクター。オブジェクトがメモリー内で解放されると、自動的に実行がトリガーされます

Pythonは高水準言語であるため、このメソッドは一般に定義する必要はありません。メモリの割り当てと解放はPythonインタープリタクラスに渡されるため、プログラマはメモリの割り当てと解放を気にする必要はありません。関数呼び出しは、ガベージコレクション中にインタープリターによって自動的にトリガーされます。

class A:
    def __init__(self):
        pass

    def __del__(self):    del 触发
        print("删除时执行我")

a = A()

import time
time.sleep(5)
del a

a = 1
b = a
a = b

ガベージコレクションのメカニズム:

    # 80  5/s
    # 引用计数
    # 标记清除
    # 分袋回收 袋一:10 2/h  袋二: 5/3 4h  袋三: 3 20h

<8> __ item__シリーズは、辞書を操作するようにインスタンスメソッドを操作できます

dic["键"] =del dic["键"]
dic["键"]

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getitem__(self, item):
        print(self.__dict__)
        print(self.__dict__[item])  # self.__dict__ 获取的就是字典

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        del self.__dict__[key]

a = A("meet",58)
a["sex"] = "男"
a["sex"]
del a["sex"]
print(a.__dict__)

<9> __ new__シングルトンモード(工場モード)

シングルトンパターンは、一般的に使用されるソフトウェア設計パターンです。コア構造には、シングルトンクラスと呼ばれる特別なクラスのみが含まれます。シングルトンモードでは、システムにクラスのインスタンスが1つだけ存在すること、およびインスタンスが外部から簡単にアクセスできることを保証できるため、インスタンスの数の制御が容易になり、システムリソースを節約できます。特定のクラスのオブジェクトを1つだけシステムに存在させたい場合は、シングルトンパターンが最適なソリューションです。

class A(object):

    def __init__(self,name):  # 初始化
        self.name = name
        print("我是__init__,先走我")

    def __new__(cls, *args, **kwargs):
        print("我是__new__,先走我")
        return "啦啦啦"

a = A("meet")
print("我是谁:",a)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A(object):

    def __init__(self,name):  # 初始化
        self.name = name
        print("我是__init__,先走我")

    def __new__(cls, *args, **kwargs):
        obj = object.__new__(A)
        print("我在哪:",obj)
        return obj                   # obj == __init__()

a = A("meet")
print("我是谁:",a)

class A(object):

    def __init__(self,name): # 初识化
        self.name = name


    def __new__(cls, *args, **kwargs):
        obj = object.__new__(A)   # 调用的是object类中的__new__ ,只有object类中的__new__能够创建空间
        return obj   #本质: obj == __init__()     return __init__()  # 触发了__init__方法


a = A("mee")  # a是对象的内存地址
a1 = A("天魔")  # a是对象的内存地址
a2 = A("天阳")  # a是对象的内存地址
print(a.name)
print(a1.name)
print(a2.name)

# 先执行__new__方法再执行__init__方法
class A:
    __a = None  #__a =  0x000001F346079FD0

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        if cls.__a is None:
            obj = object.__new__(cls)
            cls.__a = obj
        return cls.__a

a = A("mee",123)  # 地址0x000001F346079FD0
a1 = A("天魔",11)
print(a.name)
print(a1.name)

シングルトンモード:作成回数に関係なく、同じメモリ空間が使用されます。

モジュールのインポート、手書きのシングルトンモード

オブジェクトがインスタンス化されるとどうなるか:

オブジェクトを作成してオブジェクトスペースを開く__ next__

__ initメソッドを自動的に実行し、オブジェクトアドレスを暗黙的にselfに渡します

オブジェクトプロパティをオブジェクトスペースにカプセル化する

2.コンテキスト

(1)__入る__

(2)__出口__

class my_open:

    def __init__(self,file,mode="r",encoding="utf-8"):
        self.file = file
        self.mode = mode
        self.encoding = encoding

    def __enter__(self):
        self.f = open(self.file,self.mode,encoding=self.encoding)
        return self.f

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(exc_type,exc_val,exc_tb) # 没有错误时就是None
        self.f.close()


with my_open("a.txt") as ffff:
    for i in ffff:
        print(i)
print(ffff.read(1111))
print(ffff.read())
706の元の記事を公開 885を賞賛 155万ビュー+

おすすめ

転載: blog.csdn.net/sinat_38682860/article/details/105635050