所有类的父类是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):
	#自己写的方法