この記事では、Python に関する関連知識をお届けします。Python には、メソッド名が二重アンダースコアで始まり、終わる特殊なメソッドがいくつかあるため、二重アンダースコア メソッドとも呼ばれます。見てみましょう。一緒に、皆さんのお役に立てれば幸いです。
[関連する推奨事項: Python3 ビデオ チュートリアル]
Python を作成する際には、誰もが覚えておくべきことがあります。コード そのような疑いはありません。
数学の
数値は、'ab' 'cd' などの文字列操作の結合関数になるのはなぜですか。結果は
abcd ; 数値
## は
'ab' * 2 などの繰り返し関数になり、結果は
abab になります。
printはデータを出力できるのに、
printカスタム クラス オブジェクトが大量の理解できないコードを出力する理由
<__main__.MyCls object at 0x105732250>。
__add__ メソッドが文字列クラス
str で定義された後、コードで文字列追加
'ab' 'cd' が発生すると、自動的に呼び出しが行われます。
__add__ メソッドを使用して文字列の結合を完了します。
#Python でのダブル ダウンロード メソッド
1. init メソッド
init__ は、多くの人が使用するメソッドです。最初の
ダブルダウン法に触れてください。
class A: def __init__(self, a): self.a = a
A() を呼び出してオブジェクトをインスタンス化すると、
__init__ メソッドが自動的に呼び出され、オブジェクトの初期化が完了します。
double under メソッドをクラス内に定義すると、直接加算、減算、乗算、除算、比較できます。クラス オブジェクト 操作を待ちます。
Rule を定義します。これには、ルーラーの長さを表す属性
r_len が含まれます。
class Rule: def __init__(self, r_len): self.r_len = r_len
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
> を使用して
rule1 と
rule2 を比較すると、
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>
プログラムが
を実行すると、## の __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 ビット演算子
バイナリ文字列
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
下面是位运算符的双下方法
这部分也支持反向位运算符和增量赋值位运算符,规则跟算数运算符一样,这里就不再赘述。
这部分涉及两个双下方法__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
参数。
调用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__
优先级更高。
这部分可以像集合那样,定义对象长度、获取某个位置元素、切片等方法。
以__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__
。
可以在对象上使用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
做 web 开发的朋友,用类相关的双下方法会更多一些。
实例的创建是__new__
和__init__
方法,实例的销毁是__del__
方法。
__new__
的调用早于__init__
,它的作用是创建对象的实例(内存开辟一段空间),而后才将该实例传给__init__
方法,完成实例的初始化。
由于__new__
是类静态方法,因此它可以控制对象的创建,从而实现单例模式。
__del__
方法在实例销毁时,被自动调用,可以用来做一些清理工作和资源释放的工作。
类属性的访问和设置。包括__getattr__
、__getattribute__
、__setattr__
和__delattr__
方法。
__getattr__
和__getattribute__
的区别是,当访问类属性时,无论属性存不存在都会调用__getattribute__
方法,只有当属性不存在时才会调用__getattr__
方法。
控制属性的访问,一般用于把属性的取值控制在合理范围内。包括__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]
之前,防止不合法的取值。
虽然上面介绍的不是所有的双下方法,但也算是绝大多数了。
虽然双下方法里可以编写任意代码,但大家尽量编写与方法要求一样的代码。如,在__add__
方法实现的不是对象相加而是相减,虽然也能运行,但这样会造成很大困惑,不利于代码维护。
【相关推荐:Python3视频教程 】
以上がPythonのダブルダウン法を完全マスターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。