• 2018.10.24


    1. 1什么是组合
    一个对象的属性是来自于另外一个类的对象,称之为组合

    2. 为何用组合
    组合也是用来解决类与类代码冗余的问题

    3. 如何用组合

    class OldboyPeople:
    school = 'Oldboy'
    def __init__(self, name, age, gender):
    self.name = name
    self.age = age
    self.gender = gender

    class OldboyStudent(OldboyPeople):
    def choose_course(self):
    print('%s is choosing course' %self.name)

    class OldboyTeacher(OldboyPeople):
    def __init__(self, name, age, gender,level,salary):
    OldboyPeople.__init__(self, name, age, gender)
    self.level=level
    self.salary=salary

    def score(self,stu,num):
    stu.num=num
    print('老师%s给学生%s打分%s' %(self.name,stu.name,num))

    class Course:
    def __init__(self,course_name,course_price,course_period):
    self.course_name=course_name
    self.course_price=course_price
    self.course_period=course_period

    def tell_course(self):
    print('课程名:<%s> 价钱:[%s] 周期:[%s]' % (self.course_name, self.course_price, self.course_period))

    python_obj=Course('python开发',3000,'5mons')
    linux_obj=Course('linux运维',5000,'3mons')

    stu1=OldboyStudent('egon',18,'male')
    stu1.courses=[]

    2.1 什么是封装
    装指的是把属性装进一个容器
    封指的是隐藏的意思,但是这种隐藏式对外不对内的

    2. 为何要封装
    封装不是单纯意义的隐藏
    封装数据属性的目的:将数据属性封装起来,类外部的使用就无法直接操作该数据属性了
    需要类内部开一个接口给使用者,类的设计者可以在接口之上附加任意逻辑,从而严格
    控制使用者对属性的操作
    封装函数属性的目的:隔离复杂度

    3. 如何封装
    只需要在属性前加上__开头,该属性就会被隐藏起来,该隐藏具备的特点:
    1. 只是一种语法意义上的变形,即__开头的属性会在检测语法时发生变形_类名__属性名
    2. 这种隐藏式对外不对内的,因为在类内部检测语法时所有的代码统一都发生的变形
    3. 这种变形只在检测语法时发生一次,在类定义之后新增的__开头的属性并不会发生变形
    4. 如果父类不想让子类覆盖自己的属性,可以在属性前加__开头

    class Foo:
    __x=111 #_Foo__x
    def __init__(self,m,n):
    self.__m=m # self._Foo__m=m
    self.n=n

    def __func(self): #_Foo__func
    print('Foo.func')

    def func1(self):
    print(self.__m) #self._Foo__m
    print(self.__x) #self._Foo__x

    print(Foo.__dict__)
    Foo.__x
    Foo.__func
    print(Foo._Foo__x)
    Foo._Foo__func()


    obj=Foo(10,20)
    print(obj.__dict__)
    print(obj.n)
    print(obj.__m)
    print(obj._Foo__m)

    obj.func1()

    obj.__yyy=3333
    print(obj.__dict__)
    print(obj.__yyy)

    Foo.__zzz=444
    print(Foo.__dict__)
    print(Foo.__zzz)

    封装函数属性的真实意图
    # class ATM:
    # def __card(self):
    # print('插卡')
    # def __auth(self):
    # print('用户认证')
    # def __input(self):
    # print('输入取款金额')
    # def __print_bill(self):
    # print('打印账单')
    # def __take_money(self):
    # print('取款')
    #
    # def withdraw(self):
    # self.__card()
    # self.__auth()
    # self.__input()
    # self.__print_bill()
    # self.__take_money()
    #
    # a=ATM()
    # a.withdraw()


    3 需要了解的property的用法
    class People:
    def __init__(self,name):
    self.__name=name

    @property
    def name(self):
    return '<name:%s>' %self.__name

    @name.setter
    def name(self,new_name):
    if type(new_name) is not str:
    print('名字必须是str类型')
    return
    self.__name=new_name

    @name.deleter
    def name(self):
    del self.__name

    obj=People('egon')

    print(obj.name)

    # obj.name="2"
    # print(obj.name)
    # print(obj.__dict__)
    # print(People.__dict__)
    # print(_People.__dict__)
    del obj.name
    print(obj.__dict__)

    class People:
    def __init__(self,name):
    self.__name=name

    def xxx_name(self):
    return '<name:%s>' %self.__name

    def yyy_name(self,new_name):
    if type(new_name) is not str:
    print('名字必须是str类型')
    return
    self.__name=new_name

    def zzz_name(self):
    del self.__name

    name=property(xxx_name,yyy_name,zzz_name)

    obj=People('egon')
    print(obj.name)

    obj.name="dd"
    print(obj.name)

    # del obj.name
    # print(obj.__dict__)


    '''
    4.1什么是多态
    同一种事物的多种形态

    2. 为何要用多态
    多态性:指的是可以在不用考虑对象具体类型的前提下而直接使用对象下的方法

    3. 如何用多态

    # import abc
    #
    # class Animal(metaclass=abc.ABCMeta):
    # @abc.abstractmethod
    # def speak(self):
    # pass
    #
    # # Animal() # 父类不能实例化,因为父类本身就是用来制定标准的
    # class People(Animal):
    # def speak(self):
    # print('say hello')
    # # def jiao(self):
    # # print('say hello')
    #
    # class Dog(Animal):
    # def speak(self):
    # print('汪汪汪')
    #
    # class Pig(Animal):
    # def speak(self):
    # print('哼哼哼')
    #
    #
    # peo=People()
    # dog1=Dog()
    # pig1=Pig()
    # #
    # #
    # peo.speak()
    # dog1.speak()
    # pig1.speak()
    def speak(animal):
    animal.speak()

    speak(peo)
    speak(dog1)
    speak(pig1)

  • 相关阅读:
    [算法] 选择排序和插入排序
    [Machine-Learning] 机器学习中的几个度量指标
    [SDN] What is SDN?
    SpringBoot注解大全*(转发:http://www.cnblogs.com/ldy-blogs/p/8550406.html)
    java定时器的使用(Timer)(转发:https://blog.csdn.net/ecjtuxuan/article/details/2093757)
    Quartz使用总结(转发:http://www.cnblogs.com/drift-ice/p/3817269.html)
    Spring IOC/DI和AOP原理(转发:https://www.cnblogs.com/techroad4ca/p/5770073.html)
    Java设计模式之《单例模式》及应用场景(转发:http://www.cnblogs.com/V1haoge/p/6510196.html)
    JDBC注册驱动程序的三种方式
    数据库三范式的简单理解
  • 原文地址:https://www.cnblogs.com/jutao/p/9863707.html
Copyright © 2020-2023  润新知