zoukankan      html  css  js  c++  java
  • 面向对象之进阶继承

    继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生或子类

    Python中类的继承分为:单继承和多继承
    在python3中,所有类默认继承boject
    但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是 新式类)
    没有继承objeck类的子类称为经典类(在python2中,没有继承objeck的类,以及它的子类,都是经典类)
     
    # 经典类:深度优先
    # 新生类:广度优先
    # 继承顺序:从左往右,至下而上
     
    继承是一种什么‘是’什么的关系
    解决代码重用的问题,减少代码冗余
    class People:
    def __init__(self,name,age):
    self.name=name
    self.age=age
    def walk(self):
    print('%s is walking' %self.name)
    class Teacher(People):
    pass
    class Student(People):
    pass
    t=Teacher('egon',18)
    print(t.name,t.age)
    print(t.__dict__)
    t.walk()

    派生就是有自己独特的特征与技能
    class People:
    def __init__(self,name,age,sex):
    self.name = name
    self.age = age
    self.sex = sex #父类
    def walk(self):
    print('%s is walking' % self.name)
    def foo(self):
    print('from father %s' %self.name)

    class Teacher(People):
    school='oldboy'
    def __init__(self,name,age,sex,level,salary):
    People.__init__(self,name,age,sex)
    self.level=level
    self.salary=salary
    def teach(self):
    print('%s is teacher' %self.name)
    def foo(self):
    People.foo(self) #继承与派生
    print('form teacher')
    class Student(People):
    def __init__(self,name,age,sex,group):
    People.__init__(self,name,age,sex)
    self.group=group
    def study(self):
    print('%s is studying' %self.name)
    t=Teacher('egon',18,'male',10,3000)
    t.foo()
    t.teach()
    print(t.level)

    多态 python天生支持多态
    # 抽象类和接口类 归一化设计
    # 编程思想:为子类做规范
    # 归一化设计:几个类都实现了相同的方法
    # 抽象类:最好单继承,且可以简单的实现功能
    # 接口类:可以多继承,且最好不实现具体功能
    # 实现接口类和抽象类的语法
    # from abc import abstractmethod,ABCMeta
    # class 父类(metaclass=ABCMeta):
    # @abstractmethod
    # def func(self):pass

    私有属性:
    # 所有带双下划线的都是私有属性,在外面调用需要变形
    示列(1)
    class Teacher:
    __identifier = 'Teacher' # 私有静态属性
    def __init__(self,name,pwd):
    self.name=name
    self.__pwd=pwd # 私有属性
    self.__p()

    def __p(self): # 私有方法
    # print(self.__pwd)
    return hash(self.__pwd)

    def login(self,password):
    return hash(password) == self.__p()

    # print(Teacher._Teacher__identifier)
    alex = Teacher("alex",3714)
    ret = alex.login(3714)
    print(ret)
    示例(2)
    # 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
    # 成人的BMI数值:
    # 过轻:低于18.5
    # 正常:18.5-23.9
    # 过重:24-27
    # 肥胖:28-32
    # 非常肥胖, 高于32
    #   体质指数(BMI)=体重(kg)÷身高^2(m)
    #   EX:70kg÷(1.75×1.75)=22.86
    class Person:
    def __init__(self,name,height,weight):
    self.name = name
    self.__height = height
    self.__weight = weight

    def get_bmi(self):
    return self.__weight / (self.__height*self.__height)

    def change_weight(self,new_weight):
    if new_weight > 20:
    self.__weight = new_weight
    else:
    print('体重过轻')
    jinghong = Person('景弘',1.81,94)
    print(jinghong.get_bmi())
    jinghong.change_weight(88)
    print(jinghong.get_bmi())

    私有方法
    class Foo:
    def __jinghong_sb(self): #_Foo__jinghong_sb
    print('Foo')
    class Son(Foo):
    # def __jinghong_sb(self):
    # print('Son')
    def func(self):
    self.__jinghong_sb() #_Son__jinghong_sb
    son = Son()
    son.func()
    #私有方法
    #1.有一些方法的返回值只是用来作为中间结果
    #2.父类的方法不希望子类继承

    拾遗(可命名元组)
    from collections import namedtuple
    Point = namedtuple('point',['x','y'])
    t1 = Point(1,2)
    print(t1.x)
    print(t1.y)
    #没有方法并且属性不会发生变化的类
    #定义简单
    #不能改变

    property方法
    房屋 :
    业主 长 宽
    面积
    class Host:
    def __init__(self,owner,length,width):
    self.owner = owner
    self.__length = length
    self.__width = width

    @property
    def area(self):
    return self.__length*self.__width

    alex = Host("kaka",3,2)
    print(alex.owner,alex.area)



  • 相关阅读:
    Redis 和 Memcached 的区别
    缓存详解
    HTTP常见状态码
    ORM的概念, ORM到底是什么
    remote: Unauthorized fatal: Authentication failed for...
    TR、FN、FP、FN
    <笔记>ue破解
    <笔记>bmp图片数据格式
    三轴加速度数据处理
    智能手环+三轴加速度传感器总结
  • 原文地址:https://www.cnblogs.com/sunxiansheng/p/7562194.html
Copyright © 2011-2022 走看看