当前位置 : 主页 > 编程语言 > python >

python--继承

来源:互联网 收集:自由互联 发布时间:2022-07-13
继承 继承是代码的重用 子类中即实现父类的方法,又实现自己的方法: super().父类方法名(参数(自传self)) 父类名.父类方法名(参数) 子类以及子类实例化的对象 可以访问父类的任何方法或

继承

继承是代码的重用

  • 子类中即实现父类的方法,又实现自己的方法:
  • super().父类方法名(参数(自传self))
  • 父类名.父类方法名(参数)
  • 子类以及子类实例化的对象 可以访问父类的任何方法或变量.
class People():
def __init__(self, name, age):
self.Name = name
self.Age = age

def eat(self):
print('%s is eating...' % self.Name)

def talk(self):
print('%s is talking...' % self.Name)

def sleep(self):
print('%s is sleeping...' % self.Name)


class Man(People): # 继承了People类,括号里面的 父类,基类,超类 括号外面的 子类,派生类.

def sleep(self): # 有相同的方法时调用自己的
People.sleep(self) # 调用了People的sleep方法
super().sleep() # 新式类的写法
print('man is sleep...')


m1 = Man('jack', 24)
m1.eat()
m1.sleep()

结果:

jack is eating...
jack is sleeping...
jack is sleeping...
man is

# class People():#经典类
class People(object): # 新式类
def __init__(self, name, age):
self.Name = name
self.Age = age

def eat(self):
print('%s is eating...' % self.Name)

def talk(self):
print('%s is talking...' % self.Name)

def sleep(self):
print('%s is sleeping...' % self.Name)


class Man(People): # 继承了People类
def __init__(self, name, age, money): # 必须将参数都写上
# People.__init__(self,name,age) # name和age用People的实例变量,经典类写法

super(Man, self).__init__(name, age) # name和age用People的实例变量,新式类写法

self.money = money
print('%s have %s' % (self.Name, self.money))


def sleep(self): # 重构People类,有相同的方法时调用自己的
People.sleep(self) # 调用了People的方法
print('man is sleep...')


class Woman(People):
def birth(self):
print('woman is birth...')


m1 = Man('jack', 24, 88888)
m1.eat()
m1.sleep()

m2 = Woman('bob', 22)
m2.birth()
m2.sleep()

结果:

jack have 88888
jack is eating...
jack is sleeping...
woman is birth...
bob is

多继承

class People(object): # 新式类
def __init__(self, name, age):
self.name = name
self.Age = age

def eat(self):
print('%s is eating...' % self.name)

def talk(self):
print('%s is talking...' % self.name)

def sleep(self):
print('%s is sleeping...' % self.name)


class Friend(object):
def make_friend(self, obj): # 这里的obj为后面实例化的值,底下将 m1 实例化后传给了 obj
print("%s is with %s" %(self.name, obj.name)) # obj.name=jack


class Man(People, Friend): # 继承了People类
def __init__(self, name, age, money): # 必须将参数都写上
# People.__init__(self,name,age) # name和age用People的实例变量,经典类写法
super(Man, self).__init__(name, age) # name和age用People的实例变量,新式类写法
self.money = money

def sleep(self): # 重构People类,有相同的方法时调用自己的
People.sleep(self) # 调用了People的方法
print('man is sleep...')


class Woman(People, Friend):
def birth(self):
print('woman is birth...')


m1 = Man('jack', 24, 88888)
print(m1)
m2 = Woman('bob', 22)
m2.make_friend(m1) # make_friend需要传一个值,将m1传给 make_friend

结果:

<__main__.Man object at 0x0320B430>
bob is

Friend不用初始化,因为先继承people,里面有name,age,如果people和Friend换位置,也没事,因为Friend没有执行

类名.mro()查看类的继承顺序

class A:
def __init__(self):
print("A")


class B(A):
pass
# def __init__(self):
# print("B")


class C(A):
# pass
def __init__(self):
print("C")


class D(B, C):
pass
# def __init__(self):
# print("D")


obj = D()

结果:

C

py2经典类是按深度优先来继承的,新式类是按广度优先来继承的

py3经典类和新式类统一是按广度优先来继承的

python--继承_父类

 

 

class School(object):
def __init__(self, name, addr):
self.name = name
self.addr = addr
self.students = [] # 定义了列表,放学生
self.staffs = [] # 定义了列表,放老师

def enroll(self, stu_obj): # 学生注册
print('为学员%s 办理注册手续' % stu_obj.name)
self.students.append(stu_obj) # 将学生加到列表里

def hire(self, staff_obj): # 雇佣老师,staff_obj实例化,这里是Teacher类
print('雇佣新员工%s' % staff_obj.name) # staff_obj.name是Teacher里的name
self.staffs.append(staff_obj) # 加到老师列表里


class SchoolMember(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex

def tell(self):
pass


class Teacher(SchoolMember):
def __init__(self, name, age, sex, salary, course): # 先覆盖父类的

super(Teacher, self).__init__(name, age, sex) # 继承父类的name, age, sex

self.salary = salary # 添加新的属性
self.course = course

def tell(self):
print('''
-------info of Teacher:%s-------
Name:%s
Age:%s
Sex:%s
Salary:%s
Course:%s
''' % (self.name, self.name, self.age, self.sex, self.salary, self.course))

def teach(self):
print('%s is teaching course [%s]' % (self.name, self.course))


class Student(SchoolMember):
def __init__(self, name, age, sex, stu_id, grade):
super(Student, self).__init__(name, age, sex)
self.stu_id = stu_id
self.grade = grade

def tell(self):
print(''' -------info of Student:%s-------
Name:%s
Age:%s
Sex:%s
Stu_id:%s
Grade:%s
''' % (self.name, self.name, self.age, self.sex, self.stu_id, self.grade))

def pay_tuition(self, amount):
print('%s has paid tution $%s' % (self.name, amount))


school = School('高科', '西安') # 实例化了School类
t1 = Teacher('lfj', 32, 'm', 3000, 'python') # 实例化了Teacher类
t2 = Teacher('zouzou', 22, 'm', 30000, 'linuxDevops')
# 实例化了Teacher类
s1 = Student('jack', 36, 'mm', 1001, 'python') # 实例化了Student类
s2 = Student('bob', 30, 'mm', 1002, 'linuxDevops')
# 实例化了 Student类
t1.tell()
s1.tell()
school.hire(t1) # 将t1传给hire
school.enroll(s1) # 将实例化了的Student类school下的enroll
school.enroll(s2)
print(school.students) # 打印出学生的内存地址
print(school.staffs) # 打印出老师的内存地址
school.staffs[0].teach() # 调用了Teacher下的teach
for stu in school.students:
stu.pay_tuition(5000) # 调用了students下的pay_tuition

结果:

Name:lfj
Age:32
Sex:m
Salary:3000
Course:python

-------info of Student:jack-------
Name:jack
Age:36
Sex:mm
Stu_id:1001
Grade:python

雇佣新员工lfj
为学员jack 办理注册手续
为学员bob 办理注册手续
[<__main__.Student object at 0x02C9B790>, <__main__.Student object at 0x02C9B7B0>]
[<__main__.Teacher object at 0x02C9B750>]
lfj is teaching course [python]
jack has paid tution $5000
bob has paid tution $5000

 



上一篇:python--类、对象
下一篇:没有了
网友评论