Pythonのダブルダウン法を完全マスター

WBOY
リリース: 2022-07-21 17:50:37
転載
2129 人が閲覧しました

この記事では、Python に関する関連知識をお届けします。Python には、メソッド名が二重アンダースコアで始まり、終わる特殊なメソッドがいくつかあるため、二重アンダースコア メソッドとも呼ばれます。見てみましょう。一緒に、皆さんのお役に立てれば幸いです。

Pythonのダブルダウン法を完全マスター

[関連する推奨事項: Python3 ビデオ チュートリアル]

序文

Python を作成する際には、誰もが覚えておくべきことがあります。コード そのような疑いはありません。

数学の 数値は、'ab' 'cd' などの文字列操作の結合関数になるのはなぜですか。結果は abcd ; 数値 ## は 'ab' * 2 などの繰り返し関数になり、結果は abab になります。

一部のオブジェクト

printはデータを出力できるのに、printカスタム クラス オブジェクトが大量の理解できないコードを出力する理由<__main__.MyCls object at 0x105732250>

これは、システムが特別にカスタマイズされているためではなく、Python には特定の機会に自動的に呼び出される特別なタイプのメソッドがあるためです。たとえば、

__add__ メソッドが文字列クラス str で定義された後、コードで文字列追加 'ab' 'cd' が発生すると、自動的に呼び出しが行われます。 __add__ メソッドを使用して文字列の結合を完了します。

この種の特殊なメソッドのメソッド名は二重アンダースコアで始まり、終わるため、二重アンダースコア メソッドとも呼ばれます。

Pythonには二重ダウンロードの方法がたくさんありますが、今回はそれについて詳しく解説していきます。

#Python でのダブル ダウンロード メソッド

1. init メソッド

init__ は、多くの人が使用するメソッドです。最初のダブルダウン法に触れてください。

class A:
    def __init__(self, a):
        self.a = a
ログイン後にコピー

A() を呼び出してオブジェクトをインスタンス化すると、__init__ メソッドが自動的に呼び出され、オブジェクトの初期化が完了します。

2. 演算子の Double under メソッド

演算子関連の

double under メソッドをクラス内に定義すると、直接加算、減算、乗算、除算、比較できます。クラス オブジェクト 操作を待ちます。

ここでは、ルーラー クラス

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
ログイン後にコピー

4 つの比較

<<=>>= がここで定義されています演算子、次のコードを使用して 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__ メソッドが定義されています。これは 2 つのルーラーの長さを加算し、新しいルーラーを生成します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">rule1 = Rule(10) rule2 = Rule(5) rule3 = rule1 + rule2</pre><div class="contentsignin">ログイン後にコピー</div></div>以下は算術演算子の二重アンダー方式です。

2.3 逆算術演算子

他のタイプの変数をサポートします。

ルール

クラスの追加。 __radd__ メソッドを例にとります。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __radd__(self, other): return self.r_len + other</pre><div class="contentsignin">ログイン後にコピー</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">rule1 = Rule(10) rule2 = 10 + rule1</pre><div class="contentsignin">ログイン後にコピー</div></div>プログラムが

10 ルール 1

を実行すると、## の __add__ を呼び出そうとします。 #int クラスですが、 int クラスには Rule クラス オブジェクトを追加するメソッドが定義されていないため、プログラムはオブジェクト を呼び出します。 __radd__メソッドの右側にrule1を追加し、otherパラメータに10を渡します。 したがって、この演算子は右加算演算子とも呼ばれます。サポートする演算子は上記の算術演算子と同じで、メソッド名の前に r

を追加するだけです。

2.4 増分代入演算子

増分代入演算子は、

=

-=*= です。 /=など。

def __iadd__(self, other):
    self.r_len += other
    return self
ログイン後にコピー
rule1 = Rule(10)
rule1 += 5
ログイン後にコピー
__pmod__

メソッドを除き、他のすべては算術演算子と同じであり、アスペクト名の前に i が追加されます。

2.4 ビット演算子

この部分は、否定、シフト、AND または NOT などの 2 項演算をサポートします。

Rule

クラスにはビット演算が含まれないため、別の例に変更してみましょう。

バイナリ文字列 BinStr

を定義するクラスには、バイナリ文字列を表す

bin_str 属性が含まれています。

class BinStr:
    def __init__(self, bin_str):
        self.bin_str = bin_str
ログイン後にコピー
x = BinStr(&#39;1010&#39;)  #创建二进制字符串对象
print(x.bin_str) # 1010
ログイン後にコピー
BinStr

~ の否定演算子を定義します。

# ~ 运算符
def __invert__(self):
    inverted_bin_str = &#39;&#39;.join([&#39;1&#39; if i == &#39;0&#39; else &#39;0&#39; for i in self.bin_str])
    return BinStr(inverted_bin_str)
ログイン後にコピー

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

x = BinStr(&#39;1011&#39;)

invert_x = ~x
print(invert_x.bin_str) # 0100
ログイン後にコピー

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

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

3.字符串表示

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

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

def __repr__(self):
    decimal = int(&#39;0b&#39;+self.bin_str, 2)
    return f&#39;二进制字符串:{self.bin_str},对应的十进制数字:{decimal}&#39;
ログイン後にコピー
x = BinStr(&#39;1011&#39;)
print(x)
# 输出:二进制字符串:1011,对应的十进制数字:11
ログイン後にコピー

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

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

def __format__(self, format_spec):
    return format_spec % self.bin_str
ログイン後にコピー
print(&#39;{0:二进制字符串:%s}&#39;.format(x))
# 输出:二进制字符串:1011
ログイン後にコピー

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

4.数值转换

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

def __int__(self):
    return int(&#39;0b&#39;+self.bin_str, 2)
ログイン後にコピー
x = BinStr(&#39;1011&#39;)
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(&#39;1011&#39;)

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(&#39;1011&#39;)
for i in x:
    print(i)
ログイン後にコピー

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

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

def __reversed__(self):
    return BinStr(&#39;&#39;.join(list(reversed(self.bin_str))))
ログイン後にコピー
x = BinStr(&#39;1011&#39;)
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(&#39;x不能小于0,不能大于100&#39;)

    def __delete__(self, instance):
        print(&#39;删除属性&#39;)


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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:jb51.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!