Beherrschen Sie die Double-Down-Methode in Python vollständig

WBOY
Freigeben: 2022-07-21 17:50:37
nach vorne
2153 Leute haben es durchsucht
<p>Dieser Artikel bringt Ihnen relevantes Wissen über <a href="http://www.php.cn/course/list/31.html" target="_blank">Python</a>. Es gibt einige spezielle Methoden in Python, deren Methodennamen mit doppelten Unterstrichen beginnen und daher auch als Doppelunterstrich-Methoden bezeichnet werden alle. </p> <p><img src="https://img.php.cn/upload/article/000/000/067/62d4f1fd38dfa174.jpg" alt="Beherrschen Sie die Double-Down-Methode in Python vollständig" ></p> <p>【Verwandte Empfehlung: <a href="http://www.php.cn/course/list/31.html" target="_blank">Python3-Video-Tutorial</a>】</p> <h2>Vorwort</h2> <p>Haben Sie solche Fragen beim Schreiben von Python-Code? </p> <p>Warum wird das <code>+</code>-Zeichen in der Mathematik in String-Operationen in eine Verkettungsfunktion umgewandelt, wie z. B. <code>'ab' + 'cd'</code> und das Ergebnis ist <code>abcd / code>; und die <code>*</code>-Nummer wird zu einer wiederholten Funktion, z. B. <code>'ab' * 2</code>, das Ergebnis ist <code>abab</code>. <code>+</code>号,在字符串运算中却变成拼接功能,如<code>'ab' + 'cd'</code>结果为<code>abcd</code>;而<code>*</code>号变成了重复功能,如<code>'ab' * 2</code>结果为<code>abab</code>。</code></p> <p>为什么某些对象<code>print</code>能输出数据,而<code>print</code>自定义的类对象却输出一堆看不懂的代码<code><__main__.MyCls object at 0x105732250></code>。</p> <p>不是因为系统做了特殊定制,而是 Python 中有一类特殊的方法,在某些特定的场合会自动调用。如,在字符串类<code>str</code>中定义了<code>__add__</code>方法后,当代码遇到字符串相加<code>'ab' + 'cd'</code>时,就会自动调用<code>__add__</code>方法完成字符串拼接。</p> <p>因为这类特殊方法的方法名都是以双下划线开始和结束,所以又被称为双下方法。</p> <p>Python 中的双下方法很多,今天我们对它做个详解。</p> <p style="text-align:center"><img alt="" src="https://img.php.cn/upload/article/000/000/067/dc4eae5d11b7bd06ec193c866274280b-0.jpg"></p> <p style="text-align:center">Python中的双下方法</p> <h2>1. init方法</h2> <p><code>__init__</code>的方法是很多人接触的第一个<code>双下方法</code>。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">class A: def __init__(self, a): self.a = a</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>当调用<code>A()</code>实例化对象的时候,<code>__init__</code>方法会被自动调用,完成对象的初始化。</p><h2>2. 运算符的双下方法</h2><p>在类中定义运算符相关的<code>双下方法</code>,可以直接在类对象上做加减乘除、比较等操作。</p><p>这里,定义一个尺子类<code>Rule</code>,它包含一个属性<code>r_len</code>代表尺子的长度。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">class Rule: def __init__(self, r_len): self.r_len = r_len</pre><div class="contentsignin">Nach dem Login kopieren</div></div><h3>2.1 比较运算符</h3><p>如果想按照尺子的长度对不同的尺子做比较,需要在<code>Rule</code>类中定义比较运算符。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">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</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>这里定义了<code><</code>、<code><=</code>、<code>></code>和<code>>=</code>四个比较运算符,这样就可以用下面的代码比较<code>Rule</code>对象了。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">rule1 = Rule(10) rule2 = Rule(5) print(rule1 > rule2) # True print(rule1 >= rule2) # True print(rule1 < rule2) # False print(rule1 <= rule2) # False</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>当用<code>></code>比较<code>rule1</code>和<code>rule2</code>的时候,<code>rule1</code>对象会自动调用<code>__gt__</code>方法,并将<code>rule2</code>对象传给<code>other</code>参数,完成比较。</p><p>下面是比较运算符的双下方法</p><p style="text-align:center"><img alt="" src="https://img.php.cn/upload/article/000/000/067/dc4eae5d11b7bd06ec193c866274280b-1.png"/></p><p style="max-width:90%">比较运算符双下方法</p><h3>2.2 算术运算符</h3><p>可以支持类对象加减乘除。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __add__(self, other): return Rule(self.r_len + other.r_len)</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>这里定义了<code>__add__</code>方法,对应的是<code>+</code>运算符,他会把两个尺子的长度相加,并生成新的尺子。</p><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">Nach dem Login kopieren</div></div><p>下面是算术运算符的双下方法</p><p style="text-align:center"><img alt="" src="https://img.php.cn/upload/article/000/000/067/dc4eae5d11b7bd06ec193c866274280b-2.png"/></p><h3>2.3 反向算术运算符</h3><p>它支持其他类型的变量与<code>Rule</code>类相加。以<code>__radd__</code>方法为例</p><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">Nach dem Login kopieren</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">Nach dem Login kopieren</div></div><p>程序执行<code>10 + rule1</code>时,会尝试调用<code>int</code>类的<code>__add__</code>但<code>int</code>类类没有定义与<code>Rule</code>类对象相加的方法,所以程序会调用<code>+</code>号右边对象<code>rule1</code>的<code>__radd__</code>方法,并把<code>10</code>传给<code>other</code>参数。</p><p>所以这种运算符又叫右加运算符。它所支持的运算符与上面的算术运算符一样,方法名前加<code>r</code>即可。</p><h3>2.4 增量赋值运算符</h3><p>增量赋值运算符是<code>+=</code>、<code>-=</code>、<code>*=</code>、<code>/=</code>等。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __iadd__(self, other): self.r_len += other return self</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">rule1 = Rule(10) rule1 += 5</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>除了<code>__pmod__</code>方法,其他的跟算数运算符一样,方面名前都加i。</p><h3>2.4 位运算符</h3><p>这部分支持按二进制进行取反、移位和与或非等运算。由于<code>Rule</code>类不涉及位运算,所以我们换一个例子。</p><p>定义二进制字符串的类<code>BinStr</code>,包含<code>bin_str</code>属性,表示二进制字符串。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">class BinStr: def __init__(self, bin_str): self.bin_str = bin_str</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1010&#39;) #创建二进制字符串对象 print(x.bin_str) # 1010</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>给<code>BinStr</code>定义一个取反运算符<code>~</code></p>Warum einige Objekte <code>print</code> Daten ausgeben können, <code>print</code>-Objekte der benutzerdefinierten Klasse jedoch eine Menge unverständlichen Code ausgeben <code><__main__.MyCls-Objekt bei 0x105732250></code >. 🎜🎜Das liegt nicht daran, dass das System speziell angepasst wurde, sondern daran, dass es in Python einen speziellen Methodentyp gibt, der bei bestimmten Gelegenheiten automatisch aufgerufen wird. Wenn der Code beispielsweise nach der Definition der Methode <code>__add__</code> in der Zeichenfolgenklasse <code>str</code> auf die Zeichenfolgenaddition <code>'ab' + 'cd'</code> trifft, wird die Die Methode <code>__add__</code> wird automatisch aufgerufen, um das Zusammenfügen der Zeichenfolge abzuschließen. 🎜🎜Da die Methodennamen dieser Art von Spezialmethoden mit doppelten Unterstrichen beginnen und enden, werden sie auch als Doppel-Unterstrich-Methoden bezeichnet. 🎜🎜Es gibt viele Doppel-Download-Methoden in Python. Heute werden wir es im Detail erklären. 🎜<p style="text-align:center"><img alt="" src="https://img.php.cn/upload/article/000/000/067/dc4eae5d11b7bd06ec193c866274280b-0.jpg"/> 🎜<p style="max-width:90%">Double-Down-Methode in Python🎜🎜1. Init-Methode🎜🎜<code>__init__</code>-Methode ist die erste <code>Double-Download-Methode, die viele Leute verwenden in Kontakt mit Methode</code>. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;"># ~ 运算符 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)</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Wenn Sie <code>A()</code> aufrufen, um ein Objekt zu instanziieren, wird die Methode <code>__init__</code> automatisch aufgerufen, um die Initialisierung des Objekts abzuschließen. 🎜🎜2. Double-Down-Methode des Operators🎜🎜Definieren Sie die <code>double-down-Methode</code>, die sich auf den Operator in der Klasse bezieht und direkt Addition, Subtraktion, Multiplikation, Division, Vergleich und andere Operationen durchführen kann Klassenobjekt. 🎜🎜Hier definieren Sie eine Linealklasse <code>Rule</code>, die ein Attribut <code>r_len</code> enthält, um die Länge des Lineals darzustellen. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) invert_x = ~x print(invert_x.bin_str) # 0100</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><h3>2.1 Vergleichsoperatoren</h3>🎜Wenn Sie verschiedene Lineale anhand ihrer Länge vergleichen möchten, müssen Sie Vergleichsoperatoren in der Klasse <code>Rule</code> definieren. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __repr__(self): decimal = int(&#39;0b&#39;+self.bin_str, 2) return f&#39;二进制字符串:{self.bin_str},对应的十进制数字:{decimal}&#39;</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Hier sind vier Vergleiche definiert: <code><</code>, <code><=</code>, <code>></code> und <code>>=</code> Operator, damit Sie <code>Rule</code>-Objekte mit dem folgenden Code vergleichen können. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) print(x) # 输出:二进制字符串:1011,对应的十进制数字:11</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Wenn Sie <code>></code> verwenden, um <code>rule1</code> und <code>rule2</code> zu vergleichen, ruft das <code>rule1</code>-Objekt automatisch <code> auf __gt__</code>-Methode und übergeben Sie das Objekt <code>rule2</code> an den Parameter <code>other</code>, um den Vergleich abzuschließen. 🎜🎜Das Folgende ist die Doppelklickmethode des Vergleichsoperators🎜<p style="text-align:center"><img alt="" src="https://img.php.cn/upload/article/ 000/000 /067/dc4eae5d11b7bd06ec193c866274280b-1.png"/>🎜<p style="max-width:90%">Vergleichsoperator-Double-Down-Methode🎜<h3>2.2 Arithmetischer Operator</h3>🎜Kann Addition und Subtraktion unterstützen , Multiplikation und Division von Klassenobjekten. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __format__(self, format_spec): return format_spec % self.bin_str</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Hier wird die Methode <code>__add__</code> definiert, die dem Operator <code>+</code> entspricht. Sie addiert die Längen der beiden Lineale und generiert ein neues Lineal. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">print(&#39;{0:二进制字符串:%s}&#39;.format(x)) # 输出:二进制字符串:1011</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Das Folgende ist die Doppelklickmethode für arithmetische Operatoren🎜<p style="text-align:center"><img alt="" src="https://img.php.cn/upload/article/ 000/ 000/067/dc4eae5d11b7bd06ec193c866274280b-2.png"/>🎜<h3>2.3 Umkehrarithmetischer Operator</h3>🎜Es unterstützt das Hinzufügen anderer Variablentypen mit der Klasse <code>Rule</code>. Nehmen Sie als Beispiel die Methode <code>__radd__</code>🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __int__(self): return int(&#39;0b&#39;+self.bin_str, 2)</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) print(int(x))</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Wenn das Programm <code>10 + Regel1</code> ausführt, versucht es, den <code>__add__</code> des <code aufzurufen >int</code>-Klasse Die Klasse <code>int</code> definiert jedoch keine Methode zum Hinzufügen des Klassenobjekts <code>Rule</code>, daher ruft das Programm das Objekt <code>rule1< auf / rechts von der <code>__radd__</code>-Methode von <code>+</code> und übergeben Sie <code>10</code> an die <code>other</code>-Methode Parameter. 🎜🎜Dieser Operator wird daher auch Rechtsadditionsoperator genannt. Die unterstützten Operatoren sind die gleichen wie die oben genannten arithmetischen Operatoren. Fügen Sie einfach <code>r</code> vor dem Methodennamen hinzu. 🎜<h3>2.4 Inkrementeller Zuweisungsoperator</h3>🎜Die inkrementellen Zuweisungsoperatoren sind <code>+=</code>, <code>-=</code>, <code>*=</code> , <code >/=</code> usw. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __len__(self): return len(self.bin_str) def __getitem__(self, item): return self.bin_str[item]</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) print(len(x)) # 4 print(x[0]) # 1 print(x[0:3]) # 101</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Mit Ausnahme der Methode <code>__pmod__</code> ist alles andere dasselbe wie bei den arithmetischen Operatoren, wobei i vor dem Aspektnamen hinzugefügt wird. 🎜<h3>2,4-Bit-Operatoren</h3>🎜Dieser Teil unterstützt binäre Operationen wie Negation, Verschiebung und UND oder NICHT. Da die Klasse <code>Rule</code> keine Bitoperationen beinhaltet, ändern wir das Beispiel. 🎜🎜Die Klasse <code>BinStr</code>, die eine Binärzeichenfolge definiert, enthält das Attribut <code>bin_str</code>, das eine Binärzeichenfolge darstellt. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">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]</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) for i in x: print(i)</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Definieren Sie einen Negationsoperator <code>~</code>🎜 für <code>BinStr</code><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;"># ~ 运算符 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)</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p><code>__invert__</code>方法中,遍历<code>bin_str</code>字符串,将每位取反,并返回一个新的<code>BinStr</code>类对象。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) invert_x = ~x print(invert_x.bin_str) # 0100</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>下面是位运算符的双下方法</p><p style="text-align:center"><img alt="" src="https://img.php.cn/upload/article/000/000/067/4894e53be3e9850194264d258e8620e0-3.png"/></p><p>这部分也支持反向位运算符和增量赋值位运算符,规则跟算数运算符一样,这里就不再赘述。</p><h2>3.字符串表示</h2><p>这部分涉及两个双下方法<code>__repr__</code>和<code>__format__</code>,在某些特殊场景,如<code>print</code>,会自动调用,将对象转成字符串。</p><p>还是以<code>BinStr</code>为例,先写<code>__repr__</code>方法。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __repr__(self): decimal = int(&#39;0b&#39;+self.bin_str, 2) return f&#39;二进制字符串:{self.bin_str},对应的十进制数字:{decimal}&#39;</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) print(x) # 输出:二进制字符串:1011,对应的十进制数字:11</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>当程序执行<code>print(x)</code>时,会自动调用<code>__repr__</code>方法,获取对象<code>x</code>对应的字符串。</p><p>再写<code>__format__</code>方法,它也是将对象格式化为字符串。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __format__(self, format_spec): return format_spec % self.bin_str</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">print(&#39;{0:二进制字符串:%s}&#39;.format(x)) # 输出:二进制字符串:1011</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>当<code>.format</code>方法的前面字符串里包含<code>0:</code>时,就会自动调用<code>__format__</code>方法,并将字符串传给<code>format_spec</code>参数。</p><h2>4.数值转换</h2><p>调用<code>int(obj)</code>、<code>float(obj)</code>等方法,可以将对象转成相对应数据类型的数据。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __int__(self): return int(&#39;0b&#39;+self.bin_str, 2)</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) print(int(x))</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>当调用<code>int(x)</code>时,会自动调用<code>__int__</code>方法,将二进制字符串转成十进制数字。</p><p>数值转换除了上面的两个外,还有<code>__abs__</code>、<code>__bool__</code>、<code>__complex__</code>、<code>__hash__</code>、<code>__index__</code>和<code>__str__</code>。</p><p><code>__str__</code>和<code>__repr__</code>一样,在<code>print</code>时都会被自动调用,但<code>__str__</code>优先级更高。</p><h2>5.集合相关的双下方法</h2><p>这部分可以像集合那样,定义对象长度、获取某个位置元素、切片等方法。</p><p>以<code>__len__</code>和<code>__getitem__</code>为例</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __len__(self): return len(self.bin_str) def __getitem__(self, item): return self.bin_str[item]</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) print(len(x)) # 4 print(x[0]) # 1 print(x[0:3]) # 101</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p><code>len(x)</code>会自动调用<code>__len__</code>返回对象的长度。</p><p>通过<code>[]</code>方式获取对象的元素时,会自动调用<code>__getitem__</code>方法,并将切片对象传给<code>item</code>参数,即可以获取单个元素,还可以获取切片。</p><p>集合相关的双下方法还包括<code>__setitem__</code>、<code>__delitem__</code>和<code>__contains__</code>。</p><h2>6.迭代相关的双下方法</h2><p>可以在对象上使用<code>for-in</code>遍历。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">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]</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) for i in x: print(i)</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>当在<code>x</code>上使用<code>for-in</code>循环时,会先调用<code>__iter__</code>方法将游标<code>cur_i</code>置为初始值<code>-1</code>,然后不断调用<code>__next__</code>方法遍历<code>self.bin_str</code>中的每一位。</p><p>这部分还有一个<code>__reversed__</code>方法用来反转对象。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def __reversed__(self): return BinStr(&#39;&#39;.join(list(reversed(self.bin_str))))</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">x = BinStr(&#39;1011&#39;) reversed_x = reversed(x) print(reversed_x) # 输出:二进制字符串:1101,对应的十进制数字:13</pre><div class="contentsignin">Nach dem Login kopieren</div></div><h2>7.类相关的双下方法</h2><p>做 web 开发的朋友,用类相关的双下方法会更多一些。</p><h3>7.1 实例的创建和销毁</h3><p>实例的创建是<code>__new__</code>和<code>__init__</code>方法,实例的销毁是<code>__del__</code>方法。</p><p><code>__new__</code>的调用早于<code>__init__</code>,它的作用是创建对象的实例(内存开辟一段空间),而后才将该实例传给<code>__init__</code>方法,完成实例的初始化。</p><p>由于<code>__new__</code>是类静态方法,因此它可以控制对象的创建,从而实现<strong>单例模式</strong>。</p><p><code>__del__</code>方法在实例销毁时,被自动调用,可以用来做一些清理工作和资源释放的工作。</p><h3>7.2 属性管理</h3><p>类属性的访问和设置。包括<code>__getattr__</code>、<code>__getattribute__</code>、<code>__setattr__</code>和<code>__delattr__</code>方法。</p><p><code>__getattr__</code>和<code>__getattribute__</code>的区别是,当访问类属性时,无论属性存不存在都会调用<code>__getattribute__</code>方法,只有当属性不存在时才会调用<code>__getattr__</code>方法。</p><h3>7.3 属性描述符</h3><p>控制属性的访问,一般用于把属性的取值控制在合理范围内。包括<code>__get__</code>、<code>__set__</code>和<code>__delete__</code>方法。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">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</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>上述例子,通过类属性描述符,可以将属性x的取值控制在<code>[0, 100]</code>之前,防止不合法的取值。</p> <h2>8.总结</h2> <p>虽然上面介绍的不是所有的双下方法,但也算是绝大多数了。</p> <p>虽然双下方法里可以编写任意代码,但大家尽量编写与方法要求一样的代码。如,在<code>__add__</code>方法实现的不是对象相加而是相减,虽然也能运行,但这样会造成很大困惑,不利于代码维护。</p> <p>【相关推荐:<a href="http://www.php.cn/course/list/31.html" target="_blank">Python3视频教程</a> 】</p>

Das obige ist der detaillierte Inhalt vonBeherrschen Sie die Double-Down-Methode in Python vollständig. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:jb51.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage