(一)重写(overriding)
重写:子类改写父类的方法,从而部分地改变父类的行为
包括运算符、构造器在内的方法都可以被重写
重写父类方法的时候,父类方法中定义的操作不会被自动调用
1、子类定义举例和重写
# Filename: Prog8-10.py
class Dog(object):
"define Dog class"
counter = 0
def __init__(self, name):
self.name = name
Dog.counter += 1
def greet(self):
print("Hi, I am {:s}, my number is {:d}.".format(self.name, Dog.counter))
class BarkingDog (Dog):
"define subclass BarkingDog"
def greet(self):
"initial subclass"
print("Woof! I am {:s}, my number is {:d}.".format(self.name, Dog.counter))
if __name__ == '__main__':
dog = BarkingDog("Zoe")
dog.greet()
(二)重定义(redefine)
子类重写父类方法时,要求参数保持一致,若要修改参数并改变功能,则称为重定义
(1)子类__init__()方法重定义
# Filename: Prog8-11.py
class Dog(object):
… # 同 Prog8-10.py
class BarkingDog (Dog):
"define subclass BarkingDog“
def __init__(self, name, color):
super().__init__(name)
self.color = color
def greet(self):
"initial subclass"
print(Woof! I am {:s} {:s}, my number is {:d}.".format(self.color, self.name, Dog.counter))
if __name__ == '__main__':
dog = BarkingDog("Zoe", "black")
dog.greet()
(2)子类中使用父类__init__方法
def __init__(self, 父类参数, 子类参数):
super().__init__(父类参数) # 或使用 父类. __init__(父类参数)
其他函数代码块
(三)*重载(overloading)
重载指的是有相同的方法名但参数列表不同,根据参数类型和个数选择方法,一般在同一个类中实现,Python由于是动态语言且有可变长参数等特殊类型的参数,因此不显式支持普通的函数重载,但可以进行运算符重载。
*运算符重载
运算符 | 关联方法 |
+ | C.__*add__(self, obj) |
- | C.__*sub__(self, obj) |
* | C.__*mul__(self, obj) |
/ | C.__*div__(self, obj) |
% | C.__*mod__(self, obj) |
// | C.__*floordiv__(self, obj) |
** | C.__*pow__(self, obj[,mod]) |
(四)访问控制
默认情况下,Python 类的成员属性与方法都是公共的
提供“访问控制符”来限定成员函数的访问
__ #(双下划线)
限定属性和方法在类内部可见,防止父类与子类中的同名冲突
>>> class P:
def __init__(self, name):
self.__name = name
>>> x = P('John')
>>> x.__name
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
x.__name
AttributeError: 'P' object has no attribute '__name'

例:
#pro0607.py
class testc:
def __init__(self):
print('类testc加载成功!')
def __del__(self):
print('类testc删除成功!')
def fu(self):
print('方法fu调用成功!')
tc=testc()
tc.fu()
del tc
---------------------------------------
#pro0608.py
class testc(object):
def __init__(self, value='Happy You!'):
self.data=value
t=testc()
print(t) #__main__.testc object at 0x00000258A86F7EF0>
print(t) #__main__.testc object at 0x00000258A86F7EF0>
class testrepr(testc):
def __repr__(self):
return 'New Format(%s)' % self.data
tr=testrepr()
print(tr)
class teststr(testc):
def __str__(self):
return 'New String: %s' % self.data
ts=teststr()
print(ts) #__main__.teststr object at 0x00000258A87099E8>
print(ts)

