本篇文章给大家带来了关于Python的相关知识,Python中有一些特殊方法的方法名都是以双下划线开始和结束,所以又被称为双下方法,下面一起来看一下,希望对大家有帮助。
|
本篇文章给大家带来了关于Python的相关知识,Python中有一些特殊方法的方法名都是以双下划线开始和结束,所以又被称为双下方法,下面一起来看一下,希望对大家有帮助。
【相关推荐:Python3视频教程 】 前言大家在写 Python 代码的时候有没有这样的疑问。 为什么数学中的 为什么某些对象 不是因为系统做了特殊定制,而是 Python 中有一类特殊的方法,在某些特定的场合会自动调用。如,在字符串类 因为这类特殊方法的方法名都是以双下划线开始和结束,所以又被称为双下方法。 Python 中的双下方法很多,今天我们对它做个详解。
Python中的双下方法 1. init方法
class A:
def __init__(self, a):
self.a = a当调用 2. 运算符的双下方法在类中定义运算符相关的 这里,定义一个尺子类 class Rule:
def __init__(self, r_len):
self.r_len = r_len2.1 比较运算符如果想按照尺子的长度对不同的尺子做比较,需要在 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这里定义了 rule1 = Rule(10) rule2 = Rule(5) print(rule1 > rule2) # True print(rule1 >= rule2) # True print(rule1 < rule2) # False print(rule1 <= rule2) # False 当用 下面是比较运算符的双下方法
比较运算符双下方法 2.2 算术运算符可以支持类对象加减乘除。 def __add__(self, other):
return Rule(self.r_len + other.r_len)这里定义了 rule1 = Rule(10) rule2 = Rule(5) rule3 = rule1 + rule2 下面是算术运算符的双下方法
2.3 反向算术运算符它支持其他类型的变量与 def __radd__(self, other):
return self.r_len + otherrule1 = Rule(10) rule2 = 10 + rule1 程序执行 所以这种运算符又叫右加运算符。它所支持的运算符与上面的算术运算符一样,方法名前加 2.4 增量赋值运算符增量赋值运算符是 def __iadd__(self, other):
self.r_len += other
return selfrule1 = Rule(10) rule1 += 5 除了 2.4 位运算符这部分支持按二进制进行取反、移位和与或非等运算。由于 定义二进制字符串的类 class BinStr:
def __init__(self, bin_str):
self.bin_str = bin_strx = BinStr('1010') #创建二进制字符串对象
print(x.bin_str) # 1010给 # ~ 运算符
def __invert__(self):
inverted_bin_str = ''.join(['1' if i == '0' else '0' for i in self.bin_str])
return BinStr(inverted_bin_str)
x = BinStr('1011')
invert_x = ~x
print(invert_x.bin_str) # 0100下面是位运算符的双下方法
这部分也支持反向位运算符和增量赋值位运算符,规则跟算数运算符一样,这里就不再赘述。 3.字符串表示这部分涉及两个双下方法 还是以 def __repr__(self):
decimal = int('0b'+self.bin_str, 2)
return f'二进制字符串:{self.bin_str},对应的十进制数字:{decimal}'x = BinStr('1011')
print(x)
# 输出:二进制字符串:1011,对应的十进制数字:11当程序执行 再写 def __format__(self, format_spec):
return format_spec % self.bin_strprint('{0:二进制字符串:%s}'.format(x))
# 输出:二进制字符串:1011当 4.数值转换调用 def __int__(self):
return int('0b'+self.bin_str, 2)x = BinStr('1011')
print(int(x))当调用 数值转换除了上面的两个外,还有
5.集合相关的双下方法这部分可以像集合那样,定义对象长度、获取某个位置元素、切片等方法。 以 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
通过 集合相关的双下方法还包括 6.迭代相关的双下方法可以在对象上使用 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)当在 这部分还有一个 def __reversed__(self):
return BinStr(''.join(list(reversed(self.bin_str))))x = BinStr('1011')
reversed_x = reversed(x)
print(reversed_x)
# 输出:二进制字符串:1101,对应的十进制数字:137.类相关的双下方法做 web 开发的朋友,用类相关的双下方法会更多一些。 7.1 实例的创建和销毁实例的创建是
由于
7.2 属性管理类属性的访问和设置。包括
7.3 属性描述符控制属性的访问,一般用于把属性的取值控制在合理范围内。包括 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的取值控制在 8.总结虽然上面介绍的不是所有的双下方法,但也算是绝大多数了。 虽然双下方法里可以编写任意代码,但大家尽量编写与方法要求一样的代码。如,在 【相关推荐:Python3视频教程 】 以上就是完全掌握Python中的双下方法的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
