所有类的父类是object
继承的写法
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def say_hi(self):
print("hello I am{0} age{1}".format(self.name,self.age))
class Student(Person):
def __init__(self,name,age,stu_id):
Person.__init__(self,name,age)
self.stu_id = stu_id
def say_hello(self):
Person.say_hi(self)
print("stu_id{0}".format(self.stu_id))
s = Student("tom",12,121212121)
s.say_hello()
利用super函数进行父类属性的初始化
代码有问题
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def say_hi(self):
print("hello I am{0} age{1}".format(self.name,self.age))
class Student(Person):
def __init__(self,name,age,stu_id):
super(Student.self).__init__(self,name,age)
self.stu_id = stu_id
def say_hello(self):
super(Student.self).say_hi(self)
print("stu_id{0}".format(self.stu_id))
s = Student("tom",12,121212121)
s.say_hello()
类的继承关系
class A:
pass
class B(A):
pass
class C(B):
pass
class D(A):
pass
class E(B,D):
pass
print(B.mro())
print(E.__mro__)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
方法的重写
java里面的定义:名字相同,参数列表相同,返回值相同
子类的方法不能比父类更严格的权限
class D:
def __init__(self,x,y):
self.x = x
self.y = y
def area(self):
pass
class C(D):
def __init__(self,r):
D.__init__(self,r,0)
def area(self):
return 3.14*self.x*self.x
class R(D):
def __init__(self,w,h):
D.__init__(self,w,h)
def area(self):
return self.x*self.y
c = C(3)
print(c.area())
r = R(3,4)
print(r.area())
28.259999999999998
12
一种错误的示范
class D:
def __init__(self,x,y):
self.x = x
self.y = y
def area(self):
pass
class R(D):
def __init__(self,w,h):
D.__init__(self,w,h)
def __area(self):
return self.x*self.y
r = R(3,4)
print(r.area())
None
调用的是父类里面的area方法
多态
1.方法的重载与重写
2.运算符的重载
运算符的重载:
前后都加上双下划线__表示 python的内置方法
特殊方法的两个作用:1.做输出 tostring 2.运算符的重载
1.
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return "{0} {1}".format(self.name,self.age)
p = Person("Tom",12)
print(p)
2.
x = 1
y = 2
print(x+y)
print(x.__add__(y))
3
3
重载加法
def __add__(self):
#自己写的方法