方法操作
一个从父类继承过来的方法,如果不满足子类的需求,可以进行重写,重写的方法将屏蔽父类的方法,但可以显示地调用,或使用 super() 委托给父类调用,实现父类、子类的方法都可调用。
class A:
def f(self,x):
y = x + x
print(y)
class B(A):
def f(self,x):
y = (x + x)**2
print(y)
b = B()
b.f(2)
16
# 显示地调用
A.f(b, 2)
4
class A:
def f(self,x):
y = x + x
print(y)
class B(A):
def f(self,x):
super().f(x)
y = (x + x)**2
print(y)
b = B()
b.f(2)
4
16
还可使用装饰器修改方法,或添加丰富功能等。
# 将方法定义为静态方法
class C:
@staticmethod
def f(value):
print(value)
c = C()
c.f('必须传参调用')
必须传参调用
# 将私有属性定义为只读,
# 直接用不带下划线的名称访问
class C:
def __init__(self):
self.__name = '私有属性'
@property
def name(self):
return self.__name
c = C()
c.name
'私有属性'
# 尝试修改不被允许
c.name = 0
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-11-c0f354f546f5> in <module>
1 # 尝试修改不被允许
----> 2 c.name = 0
AttributeError: can't set attribute
用特殊方法定制类:
class D:
pass
d = D()
bool(d)
True
# 上述类的实例逻辑值检查为 True
# 定义为 False
class D:
def __bool__(self):
return False
d = D()
bool(d)
False
# 让数字字符串也可以相减
class Mystr(str):
def __sub__(self, other):
return str(float(self) - float(other))
m = Mystr('123')
n = Mystr('3.14')
m, n, m - n
('123', '3.14', '119.86')