目錄
前言
1. init方法
2. 運算子的雙下方法
2.1 比較運算子
2.2 算術運算子
#2.3 反向算術運算子
2.4 增量賦值運算子
2.4 位元運算子
3.字符串表示
4.数值转换
5.集合相关的双下方法
6.迭代相关的双下方法
7.类相关的双下方法
7.1 实例的创建和销毁
7.2 属性管理
7.3 属性描述符
8.总结
首頁 後端開發 Python教學 完全掌握Python中的雙下法

完全掌握Python中的雙下法

Jul 21, 2022 pm 05:50 PM
python

本篇文章為大家帶來了關於Python的相關知識,Python中有一些特殊方法的方法名稱都是以雙下劃線開始和結束,所以又被稱為雙下方法,下面一起來看一下,希望對大家有幫助。

完全掌握Python中的雙下法

【相關推薦:Python3影片教學

前言

大家在寫Python 程式碼的時候有沒有這樣的疑問。

為什麼數學中的 號,在字串運算中卻變成拼接功能,如'ab' 'cd'結果為abcd;而*號變成了重複功能,如'ab' * 2結果為abab

為什麼某些物件print能輸出數據,而print自訂的類別物件卻輸出一堆看不懂的程式碼<__main__. MyCls object at 0x105732250>

不是因為系統做了特殊定制,而是 Python 中有一類特殊的方法,在某些特定的場合會自動呼叫。如,在字串類別str中定義了__add__方法後,當程式碼遇到字串相加'ab' 'cd'時,就會自動呼叫__add__方法完成字串拼接。

因為這類特殊方法的方法名稱都是以雙底線開始和結束,所以又被稱為雙下方法。

Python 中的雙下方法很多,今天我們對它做個詳解。

Python中的雙下方法

1. init方法

__init__的方法是很多人接觸的第一個雙下方法

class A:
    def __init__(self, a):
        self.a = a
登入後複製

當呼叫A()實例化物件的時候,__init__方法會被自動調用,完成物件的初始化。

2. 運算子的雙下方法

在類別中定義運算子相關的雙下方法,可以直接在類別物件上做加減乘除、比較等操作。

這裡,定義一個尺子類別Rule,它包含一個屬性r_len代表尺的長度。

class Rule:
    def __init__(self, r_len):
        self.r_len = r_len
登入後複製

2.1 比較運算子

如果想依照尺的長度對不同的尺子做比較,需要在Rule類別中定義比較運算子。

class Rule:
    def __init__(self, r_len):
        self.r_len = r_len

    # < 运算符
    def __lt__(self, other):
        return self.r_len < other.r_len

    # <= 运算符
    def __le__(self, other):
        return self.r_len <= other.r_len

    # > 运算符
    def __gt__(self, other):
        return self.r_len > other.r_len

    # >= 运算符
    def __ge__(self, other):
        return self.r_len >= other.r_len
登入後複製

這裡定義了<<=>>=四個比較運算符,這樣就可以用下面的程式碼比較Rule物件了。

rule1 = Rule(10)
rule2 = Rule(5)
print(rule1 > rule2)  # True
print(rule1 >= rule2)  # True
print(rule1 < rule2)  # False
print(rule1 <= rule2)  # False
登入後複製

當用>比較rule1rule2的時候,rule1物件會自動呼叫 __gt__方法,並將rule2物件傳給other參數,完成比較。

下面是比較運算子的雙下方法

比較運算子雙下方法

2.2 算術運算子

#可以支援類別物件加減乘除。

def __add__(self, other):
    return Rule(self.r_len + other.r_len)
登入後複製

這裡定義了__add__方法,對應的是 運算符,他會把兩個尺子的長度相加,並產生新的尺。

rule1 = Rule(10)
rule2 = Rule(5)
rule3 = rule1 + rule2
登入後複製

下面是算術運算子的雙下方法

#2.3 反向算術運算子

它支援其他類型的變數與Rule類別相加。以__radd__方法為例

def __radd__(self, other):
    return self.r_len + other
登入後複製
rule1 = Rule(10)
rule2 = 10 + rule1
登入後複製

程式執行10 rule1時,會嘗試呼叫int類別的__add__int類別類別沒有定義與Rule類別物件相加的方法,所以程式會呼叫 號碼右邊物件rule1 __radd__方法,並把10傳給other參數。

所以這種運算子又叫右加運算子。它所支援的運算子與上面的算術運算子一樣,方法名前加上r即可。

2.4 增量賦值運算子

增量賦值運算子是 =-=*=/=等。

def __iadd__(self, other):
    self.r_len += other
    return self
登入後複製
rule1 = Rule(10)
rule1 += 5
登入後複製

除了__pmod__方法,其他的跟算數運算子一樣,方面名前都加i。

2.4 位元運算子

這部分支援以二進位進行取反、移位和與或非等運算。由於Rule類別不涉及位元運算,所以我們換一個例子。

定義二進位字串的類別BinStr,包含bin_str屬性,表示二進位字串。

class BinStr:
    def __init__(self, bin_str):
        self.bin_str = bin_str
登入後複製
x = BinStr('1010')  #创建二进制字符串对象
print(x.bin_str) # 1010
登入後複製

BinStr定義一個取反運算子~

# ~ 运算符
def __invert__(self):
    inverted_bin_str = ''.join(['1' if i == '0' else '0' for i in self.bin_str])
    return BinStr(inverted_bin_str)
登入後複製

__invert__方法中,遍历bin_str字符串,将每位取反,并返回一个新的BinStr类对象。

x = BinStr('1011')

invert_x = ~x
print(invert_x.bin_str) # 0100
登入後複製

下面是位运算符的双下方法

这部分也支持反向位运算符和增量赋值位运算符,规则跟算数运算符一样,这里就不再赘述。

3.字符串表示

这部分涉及两个双下方法__repr____format__,在某些特殊场景,如print,会自动调用,将对象转成字符串。

还是以BinStr为例,先写__repr__方法。

def __repr__(self):
    decimal = int('0b'+self.bin_str, 2)
    return f'二进制字符串:{self.bin_str},对应的十进制数字:{decimal}'
登入後複製
x = BinStr('1011')
print(x)
# 输出:二进制字符串:1011,对应的十进制数字:11
登入後複製

当程序执行print(x)时,会自动调用__repr__方法,获取对象x对应的字符串。

再写__format__方法,它也是将对象格式化为字符串。

def __format__(self, format_spec):
    return format_spec % self.bin_str
登入後複製
print('{0:二进制字符串:%s}'.format(x))
# 输出:二进制字符串:1011
登入後複製

.format方法的前面字符串里包含0:时,就会自动调用__format__方法,并将字符串传给format_spec参数。

4.数值转换

调用int(obj)float(obj)等方法,可以将对象转成相对应数据类型的数据。

def __int__(self):
    return int('0b'+self.bin_str, 2)
登入後複製
x = BinStr('1011')
print(int(x))
登入後複製

当调用int(x)时,会自动调用__int__方法,将二进制字符串转成十进制数字。

数值转换除了上面的两个外,还有__abs____bool____complex____hash____index____str__

__str____repr__一样,在print时都会被自动调用,但__str__优先级更高。

5.集合相关的双下方法

这部分可以像集合那样,定义对象长度、获取某个位置元素、切片等方法。

__len____getitem__为例

def __len__(self):
    return len(self.bin_str)

def __getitem__(self, item):
    return self.bin_str[item]
登入後複製
x = BinStr('1011')

print(len(x))  # 4
print(x[0])  # 1
print(x[0:3])  # 101
登入後複製

len(x)会自动调用__len__返回对象的长度。

通过[]方式获取对象的元素时,会自动调用__getitem__方法,并将切片对象传给item参数,即可以获取单个元素,还可以获取切片。

集合相关的双下方法还包括__setitem____delitem____contains__

6.迭代相关的双下方法

可以在对象上使用for-in遍历。

def __iter__(self):
    self.cur_i = -1
    return self

def __next__(self):
    self.cur_i += 1
    if self.cur_i >= len(self.bin_str):
        raise StopIteration()  # 退出迭代
    return self.bin_str[self.cur_i]
登入後複製
x = BinStr('1011')
for i in x:
    print(i)
登入後複製

当在x上使用for-in循环时,会先调用__iter__方法将游标cur_i置为初始值-1,然后不断调用__next__方法遍历self.bin_str中的每一位。

这部分还有一个__reversed__方法用来反转对象。

def __reversed__(self):
    return BinStr(''.join(list(reversed(self.bin_str))))
登入後複製
x = BinStr('1011')
reversed_x = reversed(x)
print(reversed_x)
# 输出:二进制字符串:1101,对应的十进制数字:13
登入後複製

7.类相关的双下方法

做 web 开发的朋友,用类相关的双下方法会更多一些。

7.1 实例的创建和销毁

实例的创建是__new____init__方法,实例的销毁是__del__方法。

__new__的调用早于__init__,它的作用是创建对象的实例(内存开辟一段空间),而后才将该实例传给__init__方法,完成实例的初始化。

由于__new__是类静态方法,因此它可以控制对象的创建,从而实现单例模式

__del__方法在实例销毁时,被自动调用,可以用来做一些清理工作和资源释放的工作。

7.2 属性管理

类属性的访问和设置。包括__getattr____getattribute____setattr____delattr__方法。

__getattr____getattribute__的区别是,当访问类属性时,无论属性存不存在都会调用__getattribute__方法,只有当属性不存在时才会调用__getattr__方法。

7.3 属性描述符

控制属性的访问,一般用于把属性的取值控制在合理范围内。包括__get____set____delete__方法。

class XValidation:
    def __get__(self, instance, owner):
        return self.x

    def __set__(self, instance, value):
        if 0 <= value <= 100:
            self.x = value
        else:
            raise Exception('x不能小于0,不能大于100')

    def __delete__(self, instance):
        print('删除属性')


class MyCls:
    x = XValidation()

    def __init__(self, n):
        self.x = n

obj = MyCls(10)
obj.x = 101
print(obj.x) # 抛异常:Exception: x不能小于0,不能大于100
登入後複製

上述例子,通过类属性描述符,可以将属性x的取值控制在[0, 100]之前,防止不合法的取值。

8.总结

虽然上面介绍的不是所有的双下方法,但也算是绝大多数了。

虽然双下方法里可以编写任意代码,但大家尽量编写与方法要求一样的代码。如,在__add__方法实现的不是对象相加而是相减,虽然也能运行,但这样会造成很大困惑,不利于代码维护。

【相关推荐:Python3视频教程

以上是完全掌握Python中的雙下法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
兩個點博物館:所有展覽以及在哪裡可以找到它們
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
兩個點博物館:所有展覽以及在哪裡可以找到它們
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

怎麼下載deepseek 小米 怎麼下載deepseek 小米 Feb 19, 2025 pm 05:27 PM

怎麼下載deepseek 小米

模板化的優點和缺點有哪些? 模板化的優點和缺點有哪些? May 08, 2024 pm 03:51 PM

模板化的優點和缺點有哪些?

Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2 Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2 Jul 01, 2024 am 07:22 AM

Google AI 為開發者發佈 Gemini 1.5 Pro 和 Gemma 2

只要250美元,Hugging Face技術主管手把手教你微調Llama 3 只要250美元,Hugging Face技術主管手把手教你微調Llama 3 May 06, 2024 pm 03:52 PM

只要250美元,Hugging Face技術主管手把手教你微調Llama 3

golang 函數調試與分析的完整指南 golang 函數調試與分析的完整指南 May 06, 2024 pm 02:00 PM

golang 函數調試與分析的完整指南

分享幾個.NET開源的AI和LLM相關專案框架 分享幾個.NET開源的AI和LLM相關專案框架 May 06, 2024 pm 04:43 PM

分享幾個.NET開源的AI和LLM相關專案框架

deepseek怎麼問他 deepseek怎麼問他 Feb 19, 2025 pm 04:42 PM

deepseek怎麼問他

NET40是什麼軟體 NET40是什麼軟體 May 10, 2024 am 01:12 AM

NET40是什麼軟體

See all articles