• python学习笔记1 -- 面向对象编程高级编程1


    说起高级其实也就是些基础的东西,但是活用和熟用肯定会大幅度提升代码质量

    首先要记录的是面向对象的灵活性,及如何去控制其灵活性,她允许你在实例中新增属性和方法,允许你给类新增属性和方法,也支持在定义类时就声明方法,正因为如此,才让他变得很灵活,但是很多时候不是随心所欲,如果过于灵活,那任何一个子类都可以对基类去修修改改,显然是不合适的,那么我们就需要去控制这种灵活度,于是slots函数出现了。

    __slots__函数

    slots函数限定了当前类中的属性值,一旦出现了slots函数,那么该类的实例只能使用slots中声明过得属性,举例如下

    class Student(object):
    __slots__ = ('name', 'age')

    def __init__(self, name, age):
    self.name = name
    self.age = age


    s = Student('baxiaobin', '12')
    print (s.name)
    print (s.age)
    s.grade = 100
    print (s.grade)
    一个学生类有姓名和年龄,但是没有成绩,如果一个学生类的实例想要私自加一个成绩的值,则是不被允许的,因为你爸爸没有,你也不准有
    那么问题来了,如果我爸爸没有,但是我爷爷有,那如何呢,那是可以的。因为这种家产,只要是你家的,你就可以用,所以爸爸没有爷爷有的话,那也是允许你用的
    举例
    class Student(object):
    __slots__ = ('name', 'age')

    def __init__(self, name, age):
    self.name = name
    self.age = age


    class MaleStudent(Student):
    __slots__ = ('hj')

    def __init__(self, hj):
    self.hj = hj

    m = MaleStudent('yhj')
    m.age=12
    m.name= 'baxiaobin'
    print (m.name)
    print (m.hj)
    如上,声明的实例如果比作自己,类比作爸爸,那爸爸是没有name属性的,只有爷爷有,那自己也是可以用爷爷的属性的。
    好接下来说第二重要的东西,
    @property 和
    @方法名.setter
    这两个暂时不用管其深层次逻辑,只知道是装饰器和用法就行了,@property允许将一个不带参数的方法定义为一个特殊方法,并且使用@方法名.setter的方式装饰带参数的赋值方法,被这么装饰过后,就允许我们通过
    实例名.方法名 = 值 的方式进行赋值,同事允许通过实例名.方法名的方式进行值的调用。
    举例如下
    class Screen(object):
    @property
    def width(self):
    return self._width

    @width.setter
    def width(self, value):
    self._width = value

    @property
    def height(self):
    return self._height

    @width.setter
    def height(self, value):
    self._height = value

    @property
    def resolution(self):
    return self._width * self._height

    # 测试:
    s = Screen()
    s.width = 1024
    s.height = 768
    print('resolution =', s.resolution)

    上面的例子中,通过修饰了了width和heigth方法,这两个方法变成了直接通过名称赋值的方式,同事还修饰了一个只读的方法resolution

    说完这个还要提一个,多重继承的概念
    比如一个场景:
    一个最简单的三层继承的例子,如果按照这个继承模式,最后应该会出现九个子类,而且如果继续继承,将会指数增长类的数量,显然不合适

    第一级别 美食类
    第二级别 美食类包括:火锅-冒菜-串串
    第三级别 火锅类包括:清汤火锅(火锅),红汤火锅(火锅),鸳鸯锅火锅(火锅),冒菜类包括:清汤冒菜(冒菜),红汤冒菜(冒菜),鸳鸯锅冒菜(冒菜),串串类:。。。(共九个)

    首先我们需要对每一个子类设计自己的方法,特麻烦,而且数量太多,代码重复性特别高,比如清汤的东西都是不辣的,但是我们在每一个清汤的
    类中都需要声明一次不辣这个属性。为什么呢,因为爸爸没有啊,我爸爸只是火锅,冒菜和串串中的一个而已。

    优化后如此继承
    第一级别 美食类
    第二级别 美食类包括:火锅-冒菜-串串 以及 红汤美食-清汤美食-鸳鸯美食
    第三级别 清汤火锅(火锅,清汤)

    不辣的属性继承自清汤类,火锅的属性继承自火锅,有了两个爸爸,我既有火锅爸爸,又有清汤爸爸,傲娇,任性,我就是清汤火锅,我为自己代言
    这时候只要把不辣的属性放在清汤爸爸中欧冠,所有的有清汤爸爸的子类都可以用不辣这个属性啦,就很强大
    最后提一点,多重继承,除了主属性之外,其他副属性通常后面用 Mixln修饰,
    比如 StyleMisln 这种命名
    以下是美食类代码(代码不规范的哈):
    class Ms():
    def mss(self):
    print ("能吃")


    c = Ms()


    class hg(Ms):
    def hg(self):
    self.hg1 = '自己煮的'
    print (self.hg1)

    class mc(Ms):
    def mc(self):
    self.mc1 = '别人煮好'
    print (self.mc1)

    class cc(Ms):
    def cc(self):
    self.cc1 = '带签签自己煮'
    print (self.cc1)


    class qt(Ms):
    def qt(self):
    self.qt1 = '不辣'
    print (self.qt1)


    class ht(Ms):
    def ht(self):
    self.ht1 = "辣的很"
    print (self.ht1)


    class hthg(hg, ht):
    pass

    z1 = hthg()

    print ('以下是火锅的特点:')
    z1.mss()
    z1.ht()
    z1.hg()




  • 相关阅读:
    Selenium使用SauceLab示例
    Pandas读取多个csv文件
    基于BDD的跨语言SDK测试
    使用lxml解析HTML
    PyYAML中自定义tag标签获取环境变量值
    求职指导
    Python中如何理解闭包
    如何理解if __name__ == '__main__'
    Python实现二叉树最近公共祖先节点
    nvidia docker安装
  • 原文地址:https://www.cnblogs.com/baxiaobin/p/13391691.html
Copyright © 2020-2023  润新知