1,运算符重载
# 这是一个用于描述向量的类,然而它的输出似乎并不符合我们的期望。
class vector:
def __init__(self,x,y):
self.x = x
self.y = y
p1 = vector(3,4)
p2 = vector(6,7)
print(p1) # 我们希望能打印出一个坐标。事实上:<__main__.vector object at 0x0000020F7D17DFD0>
print(p1+p2) # 我们希望能打印出和向量的坐标。事实上:TypeError: unsupported operand type(s) for +: 'vector' and 'vector'
# 第一个问题的解决需要重写__str__()方法,这个方法是类自带的,用于控制输出的格式。修改如下:
def __str__(self):
return f"({self.x},{self.y})"
# 这样就能打印出实例所对应的坐标而非内存地址。
# 第二个问题的解决涉及到运算符重载,也就是对运算符的含义进行重写。类中加号的方法是__add__,因此重写如下:
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return vector(x, y) # 将结果转化为类的实例再返回可以保证输出格式的一致
# 将上面两个重写的函数放到类vector中再次运行即可解决问题
运算符及对应方法名总结
一元运算符
二元运算符
比较运算符
2,反射
反射:通过字符串形式导入模块、寻找函数、增删成员。
module = input('Input module name:')
Module = __import__(module, fromlist=True) # 导入模块,模块名字是module,Module相当于模块的别名
Module.f() # 调用导入模块的f函数
function_name = input('Input function name:')
function = getattr(Module, function_name) # 调用模块中的function_name函数
function()
①getattr()函数
getattr(object,name,str)
1:寻找属性,存在返回属性值,不存在报错或返回设定的值;
2:寻找函数,存在返回函数地址,不存在报错或返回设定的值。
class test:
name = 'test_class'
def test_function(self):
print("hello,world")
test_object = test()
print(getattr(test_object,'name','Not found.')) # test_class
print(getattr(test_object,'age','Not found.')) # Not found.
print(getattr(test,'test_function','I found this function.')) # <function test.test_function at 0x000001EC27BF7430>
print(getattr(test,'it','No this function.')) # No this function.
②hasattr()函数
hasattr(object,name)
寻找属性或函数,存在返回True,不存在返回False
print(hasattr(test,'name')) # True
print(hasattr(test,'age')) # False
print(hasattr(test,'test_function')) # True
print(hasattr(test,'it')) # False
③setattr()函数
setattr(object,name,value) == object.name = value
④delattr()函数
delattr(object,name) == del object.name