zoukankan      html  css  js  c++  java
  • 第十九天

    今日内容

    一、poprety装饰器

    1.1poprety装饰器的作用

      隐藏调用类内函数的括号
      应用场景:
      当用户操作时是想以取值的方式得到数据,而这个数据必须要用类内功能才能得到
      这时隐藏类内函数的括号让用户以为执行的是取值操作
      例:
            class bni():
                def __init__(self,name,weight,height):
                    self.name = name
                    self.weight = weight
                    self.height = height
                @property
                def dmi(self):
                    return self.weight / (self.height  ** 2)
    
            kkk = bni("hh",60,170)
            print(kkk.dmi)
    

    1.2setter与deleter

      让函数经过poprety装饰器之后更像取值操作
      例:
            class People():
                def __init__(self,name):
                    self.__name = name
                @property              #property:控制查看值
                def name(self):
                    return self.__name
    
                @name.setter          #setter:控制修改值
                def name(self,x):
                    if type(x) is not str:
                        raise Exception("必须是字符串类型")    #让系统直接报错并显示报错信息
                    self.__name = x
    
                @name.deleter        #deleter:控制删除值
                def name(self):
                    raise Exception("不能删除")
    
            xxx  = People("xxx")
            print(xxx.name)
            xxx.name = 111
            print(xxx.name)
    

    二、面向对象编程之绑定

    2.1绑定方法与非绑定方法

      '''
      绑定方法;
          特点:绑定给谁就应该谁来调用,谁来调用就会将自己当做第一个参数传入
      非绑定方法:
          特点:不与类和对象绑定,意味着谁都可以来调用,但无论谁来调用就是一个普通函数,没有自动传参的效果
      '''
    
      class People:
          def __init__(self,name):
              self.name = name
    
          #但凡在类中定义一个函数,默认就是绑定给对象的,应该由对象来调用,
          #会将对象当作第一个参数自动传入
          def tell(self):
              print(self.name)
    
    
          #类中定义的函数被classmethod装饰过,就绑定给类,应该由类来调用,
          #类来调用会将类本身当做第一个参数自动传入
          @classmethod
          def f1(cls):    #这时cls = People
              print(cls)
    
          #类中定义的函数被staticmethod装饰过,就成一个非绑定的方法即一个普通函数,谁都可以调用
          #但是无论谁来调用就是一个普通函数,没有自动传参的效果
          @staticmethod
          def f2(x,y):
              print(x,y)
    
    
      p1 = People("egon")
      print(p1.name)
    

    三、面向对象编程之继承

    3.1继承

      #什么是继承:继承是创建新类的一种方式
      #新建的类称之为子类
      #被继承的类称之为父类或基类或超类
      # 继承的特点是:子类可以继承父类的属性
    
      #类是用来解决对象之间冗余问题的
      #而继承则是来解决类与类之间冗余问题的
    
      #先抽象再继承
      #在python中支持多继承
      # 例:
      class Parent1:
          pass
      class Parent2:
          pass
      class Sub1(Parent1):     #父类为Parent1,Sub1为子类
          pass
      class Sub2(Parent1,Parent2):   #父类为:Parent1和Parent2,子类为Sub2
          pass
    
      print(Sub1.__bases__)
      print(Sub2.__bases__)
    
    
      #但凡是继承了object类的之类以及该之类的子子孙孙类都是新式类
      #反之就是经典类
    
      #在python2中有新式类与经典类之分,在python3中全是新式类
      print(Parent1.__bases__)      #没有父类默认继承object类
    
    
      # 继承背景下的属性查找
      # 查找顺序为先从对象自己的名称空间找,再从类里找,再从父类里面找,直到找到object
      # 例1:
      class Bar:
          def f1(self):
              print("Bar.f1")
    
          def f2(self):
              print("Bar.f2")
              self.f1()
    
      class Foo(Bar):
          def f1(self):
              print("Foo.f1")
    
      obj = Foo()
      obj.f2()    #返回为Bar.f2,Foo.f1,先从对象本身找再往上找
    
      # 例2
      class Bar:
          def __f1(self):     #变形为:_Bar__f1
              print("Bar.f1")
    
          def f2(self):
              print("Bar.f2")
              self.__f1()       #变形为:self._Bar__f1()
    
      class Foo(Bar):
          def __f1(self):      #变形为:_Foo__f1()
              print("Foo.f1")
    
      obj1 = Foo()
      obj1.f2()   #返回为:Bar.f2和Bar.f1,应为__开头的隐藏函数在定义时就发生了变形
  • 相关阅读:
    C#预编译指令
    net 数据库连接详解 相当经典啊
    C#中参数前缀ref、out的使用
    C#中HTML字符转换函数
    SQL语句【TSQL汇总】
    64位XP操作系统下访问Access数据库的问题及解决
    ASP.NET Cache的一些总结
    xml 总结
    POJ 1011 Sticks
    POJ 3278 Catch That Cow
  • 原文地址:https://www.cnblogs.com/kk942260238/p/14264445.html
Copyright © 2011-2022 走看看