Python的运算符实际上是通过调用对象的特殊方法实现的。
a = 20
b = 30
c = a + b
d = a.__add__(b) # a + b的本质
print("c=",c) # c= 50
print("d=",d) # d= 50
常用特殊方法
方法 | 说明 | 例子 |
__init__ | 构造方法 | 对象创建和初始化:p = Person() |
__del__ | 析构方法 | 对象回收 |
__repr__ __str__ | 打印,转换 | print(a) |
__call__ | 函数调用 | func() |
__getattr__ | 点号运算 | obj1.xxx |
__setattr__ | 属性赋值 | obj1.xxx = value |
__getitem__ | 索引运算 | obj1[key] |
__setitem__ | 索引赋值 | obj1[key] = value |
__len__ | 长度 | len(obj1) |
运算符对应方法
算符 | 特殊方法 | 说明 |
---|---|---|
+ | __add__ | 加法 |
- | __sub__ | 减法 |
< <= == |
| 比较运算符 |
> >= != |
| 比较运算符 |
| ^ & |
| 或、异或、与 |
<< >> |
| 左移、右移 |
* / % // |
| 乘、浮点除、模运算(取余)、整数除 |
** | __pow__ | 指数运算 |
可以重写上面的特殊方法,实现运算符的重载
class Person:
def __init__(self,name):
self.name = name
def __add__(self, other):
if isinstance(other,Person):
return "{0}--{1}".format(self.name,other.name)
else:
return "不是同类对象,不能相加"
def __mul__(self, other):
if isinstance(other,int):
return self.name*other
else:
return "不是同类对象,不能相乘"
p1 = Person("竹筒饭")
p2 = Person("饭桶竹")
pp = p1 + p2
print(pp) # 竹筒饭--饭桶竹
print(p1*3) # 竹筒饭竹筒饭竹筒饭
Python对象中包含很多双下划线开始和结束的属性,这些都是特殊属性,有特殊用法。常见特殊属性:
特殊属性 | 含义 |
obj.__dict__ | 对象的属性字典 |
obj.__class__ | 对象所属的类 |
class.__bases__ | 类的父类元组(多继承) |
class.__base__ | 类的父类 |
class.__mro__ | 类层次结构 |
class.__subclasses_() | 子类列表 |
class A:
pass
class B:
pass
class C(B,A):
def __init__(self,item):
self.item = item
def func1(self):
print("func1")
c = C(3)
print(c.__dict__)
print(c.__class__)
print(C.__bases__)
print(C.mro())
print(A.__subclasses__())
"""
{'item': 3}
<class '__main__.C'>
(<class '__main__.B'>, <class '__main__.A'>)
[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
[<class '__main__.C'>]
"""