第十九天

今日内容

一、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,应为__开头的隐藏函数在定义时就发生了变形
原文地址:https://www.cnblogs.com/kk942260238/p/14264445.html