zoukankan      html  css  js  c++  java
  • day26

    1.今日内容;

            0.组合

            1.多态与多态性

            2.封装

            3.property

            4.绑定方法与非绑定方法:

    classmethod,staticmethod

     ' ' '

    1.什么是组合

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

     2.为何组合

         组合也是用来解决类与类代码沉余的问题

     3.如何用组合

      ' ' '

     class Foo:
         aaa=1111
         def __init__(self,x,y):
             self.x=x
             self.y=y
    
         def func1(self):
             print('Foo内的功能')
    
    
    class Bar:
         bbb=2222
         def __init__(self, m, n):
             self.m = m
             self.n = n
    
        def func2(self):
             print('Bar内的功能')
    
    obj1=Foo(10,20)
    obj2=Bar(30,40)
    
     obj1.xxx=obj2
     print(obj1.x,obj1.y,obj1.aaa,obj1.func1) print(obj1.xxx.m,obj1.xxx.n,obj1.xxx.bbb,obj1.xxx.func2)
    
    
    
     class OldboyPeople:     school = 'Oldboy'     def __init__(self, name, age, gender,course_name,course_price,course_period):         self.name = name         self.age = age         self.gender = gender         self.course_name = course_name         self.course_price = course_price         self.course_period = course_period 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,course_name,course_price,course_period):         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)) stu1=OldboyStudent('egon',18,'male','Python开发',3000,'5mons') stu2=OldboyStudent('kevin',38,'male','Python开发',3000,'5mons') def tell_course(obj):     print('课程名:<%s> 价钱:[%s] 周期:[%s]' %(obj.course_name,obj.course_price,obj.course_period)) tell_course(stu1) tell_course(stu2)
    
    
    
    
    
    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=[]
    stu1.courses.append(linux_obj)
    stu1.courses.append(python_obj)
    stu1.courses[0].tell_course()
    
    
    stu2=OldboyStudent('kevin',38,'male')

       封装

    1. 什么是封装

         装指的是把属性装进一个容器

          封指的是隐藏的意思,但是这种隐藏式对外不对内的

    2,为何要封装

          封装不是单纯意义的隐藏

          封装数据属性的目的:将数据属性封装起来,类外部的使用就无法直接操作该数据属性了

                 需要在上学前加上_开头,该属性就会隐藏起来,该隐藏具备的特点:

                      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)
     print(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 Foo:
         def __f1(self): #_Foo__f1
             print('Foo.f1')
    
         def f2(self):
             print('Foo.f2')
             self.__f1() #self._Foo__f1
    
     class Bar(Foo):
         def __f1(self): #_Bar__f1
             print('Bar.f1')
    
     obj=Bar()
     obj.f2()
    
    
     封装数据属性的真实意图
     class People:
         def __init__(self,name,age):
             self.__name=name
             self.__age=age
    
         def tell_info(self):
             print('<name:%s age:%s>' %(self.__name,self.__age))
    
         def set_info(self,new_name,new_age):
             if type(new_name) is not str:
                 print('名字必须是str类型傻叉')
                 returnif type(new_age) is not int:#
    print(
    '年龄必须是int类型傻叉') return self.__name=new_name self.__age=new_age def clear_info(self): del self.__name del self.__age obj=People('egon',18) obj.tell_info() obj.set_info('egon',18) 封装函数属性的真实意图 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()

    property装饰器:

    列一: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 People:
         def __init__(self,name,weight,height):
             self.name=name
             self.weight=weight
             self.height=height
    
         @property
         def bmi(self):
             return self.weight / (self.height ** 2)
    
     obj=People('egon',70,1.82)
     obj.height=1.85
    
     print(obj.bmi)
    
    
    
     需要了解的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=123
      print(obj.name)
    
     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=123
     print(obj.name)
    
    del obj.name
    print(obj.__dict__)

    多态:

    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)
    
    
    
    
    class Memory:
        def read(self):
            print('mem read')
    
        def write(self):
            print('mem write')
    
    class Disk:
        def read(self):
            print('disk read')
    
        def write(self):
            print('disk write')
    
    class Cpu:
        def read(self):
            print('cpu read')
    
        def write(self):
            print('cpu write')
    
    
    obj1=Memory()
    obj2=Disk()
    obj3=Cpu()
    
    obj1.read()
    obj2.read()
    obj3.read()
    
    
     ''.__len__()
     [].__len__()
     len([1,2,3]) #[1,2,3].__len__()

                                                                                                                                                                                                                                                                                                                                                                                                                                  

  • 相关阅读:
    NOIP2015 斗地主
    BZOJ 2120: 数颜色
    BZOJ 1014: [JSOI2008]火星人prefix
    BZOJ 4665: 小w的喜糖
    BZOJ 3665: maths
    BZOJ 3270: 博物馆
    BZOJ 1419: Red is good
    【转】二分图的最大匹配
    POJ 3026 Borg Maze(Prim+BFS建邻接矩阵)
    POJ 2485 Highway(Prim+邻接矩阵)
  • 原文地址:https://www.cnblogs.com/hui2002/p/9844623.html
Copyright © 2011-2022 走看看