首页 > 代码库 > Python基础day-18[面向对象:继承,组合,接口归一化]

Python基础day-18[面向对象:继承,组合,接口归一化]

继承:

  在Python3中默认继承object类。但凡是继承了object类以及子类的类称为新式类(Python3中全是这个)。没有继承的称为经典类(在Python2中没有继承object以及他的子类都是经典类。)

  继承是类与类的关系,解决了代码重用的问题,减少冗余代码。在Python中是先定义父类,然后在定义子类。最后使用 子类来实例化对象。

  "继承是一种什么是什么的关系。例如:下面的s1是obj的子类。"

#父类的定义:
class
obj: #定义一个obj类 pass class s1(obj): #定义s1类,括号内填上其父类,多个父类使用逗号隔开。 pass print(obj.__bases__) #查看其继承关系 print(s1.__bases__) 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-18/tmp.py (<class object>,) #默认继承object类 (<class __main__.obj>,) #继承的 obj类 Process finished with exit code 0

  当对象引用了一个属性,但是类中没有的话就会去类的父类中查询,没有在继续向上查询。

class obj:  
    a = abc‘   #父类中有一个变量 "a = ‘abc‘"

class s1(obj):
    pass

p1 = s1()    #使用子类实例化一个对象
print(p1.a)  #查看对象p1的属性a信息

执行结果:
D:\Python\Python36-32\python.exe E:/Python/DAY-18/tmp.py
abc    #显示的是父类的属性信息

Process finished with exit code 0

 

 派生:

  指子类除从父类继承的属性,自己独有的属性。

class obj_1:
    def __init__(self, name, age, sex):    #父类中共有的属性
        self.name = name
        self.age = age
        self.sex = sex

class obj_2(obj_1):    
    school = Oldboy‘   #<------:这也是子类自己独有的

    def __init__(self, name, age, sex, salary):
        obj_1.__init__(self, name, age, sex)      #传值给父类
        self.salary = salary   #自己独有的属性

class stu(obj_1):
    job = student

zhang = obj_2(zhang, 88, nan, 5000)   #实例化对象
wang = stu(wang, 55,nan)

print(wang.name, wang.age, wang.job)
print(zhang.name, zhang.age, zhang.sex, zhang.salary, zhang.school)

执行结果:
D:\Python\Python36-32\python.exe E:/Python/DAY-18/1.py
wang 55 student
zhang 88 nan 5000 Oldboy

Process finished with exit code 0

 

 

组合:

  "组合是一种 什么有什么的关系"

  也是用于减少重复代码。

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

class obj_2(obj_1):
    school = Oldboy

    def __init__(self, name, age, sex, salary,year,mon,day):
        obj_1.__init__(self, name, age, sex)
        self.salary = salary
        self.birth = Date(year,mon,day)    #boj_1子类有个 Date <-----此处调用date类
class stu(obj_1):
    job = student

class Date:    #定义 Date类
    def __init__(self,year,mon,day):
        self.year = year
        self.mon = mon
        self.day = day
    def tell_birth(self):
        print(%s%s%s%(self.year,self.mon,self.day))


zhang = obj_2(zhang, 88, nan, 5000,1994,11,32)
wang = stu(wang, 55,nan)

print(wang.name, wang.age, wang.job)
print(zhang.name, zhang.age, zhang.sex, zhang.salary, zhang.school,)
zhang.birth.tell_birth()    #查看信息

执行结果:
D:\Python\Python36-32\python.exe E:/Python/DAY-18/1.py
wang 55 student
zhang 88 nan 5000 Oldboy
19941132         #输出信息

Process finished with exit code 0

 

 接口化归一设计:

  限制子类一定要有父类的方法,子类实现的方法必须跟父类的方法名字一样。

import abc   #导入abc模块 

class obj(metaclass=abc.ABCMeta):    #元类
    @abc.abstractclassmethod   @调用装饰器,限制子类的方法名
    def read(self):
        pass
    @abc.abstractclassmethod
    def write(self):
        pass

class s1(obj):
    def read(self):    #子类的方法名必须跟父类一致,否则报错
        print(is read)
    def write(self):
        print(is write)
class s2(obj):
    def read(self):
        print(is read)
    def write(self):
        print(is write)

p1=s1()
p1.read()   

执行结果:
D:\Python\Python36-32\python.exe E:/Python/DAY-18/tmp.py
is read

Process finished with exit code 0

 

Python基础day-18[面向对象:继承,组合,接口归一化]