python基础 day27 面向对象—内置函数 @calssmethod,@staticmethod 类中的内置方法

一、内容回顾

1、super

  • 遵循mro算法

  • 只在新式类中

  • py2自己添加参数 super(类名称,子类对象)

2、封装

  • 广义上的封装

  • 狭义上的封装

    • 方法私有化

    • 实例变量

    • 静态变量

    • 方法:在变量前面加__

    • 私有化的特点

      • 只能在类的内部使用,不能在外部使用

    • 私有的各种静态变量和方法:不能继承

3、内置函数

  • 判断一个变量是否可以被调用,判断变量后面是否能加括号

    • callable(名字) 检测是否可被调用

  • 装饰器

    • property 把一个方法伪装成属性,在调用时,可以不加括号

    • 给伪装成属性的方法赋值 @函数名.setter

  • 反射相关

    • hasattr 判断是否可以被调用(是对象的属性还是方法)

    • getattr

二、今日内容

1、两个装饰器

  • @classmethod 非常重要

    • 把一个对象绑定的方法,修改成一个类方法

    • 第一:在方法中任然可以引用类中的静态变量

    • 第二可以不用实例化对象,就直接在类外部调用这个方法:类名.方法()

      class Goods:
         __discount = 0.8
         def __init__(self):
             self.__price = 5
             self.price = self.__price * self.__discount
         @classmethod
         def change_discount(cls,new_discount):
             cls.__discount = new_discount
      Goods.change_discount(0.5)
      g = Goods()
      print(g.price)
      g.change_discount(0.3)  #发现无法修改私有变量
      print(g.price)

       

  • @staticmethod :被装饰的方法会成为一个静态方法

    # python核心编程\基础教程\流畅的python\数据结构与算法(机械工业出版社)\cook book
    import time
    class Date:
       def __init__(self,year,month,day):
           self.year = year
           self.month = month
           self.day = day
       @classmethod
       def today(cls):
           struct_t = time.localtime()
           date = cls(struct_t.tm_year,struct_t.tm_mon,struct_t.tm_mday)
           return date

    date对象 = Date.today()
    print(date对象.year)
    print(date对象.month)
    print(date对象.day)

     

2、类中的内容

class A:
   country = '中国'
   def func(self):
       print(self.__dict__)
   @classmethod
   def clas_func(cls):
       print(cls)
   @staticmethod
   def stat_func():
       print('普通函数')
   @property
   def name(self):
       return 'wahaha'
# 能定义到类中的内容
# 静态变量 是个所有的对象共享的变量 有对象\类调用 但是不能重新赋值
# 绑定方法 是个自带self参数的函数   由对象调用
# 类方法   是个自带cls参数的函数     由对象\类调用
# 静态方法 是个啥都不带的普通函数   由对象\类调用
# property属性 是个伪装成属性的方法 由对象调用 但不加括号

能定义到类中的内容

静态变量 是个所有的对象共享的变量 有对象\类调用 但是不能重新赋值

绑定方法 是个自带self参数的函数 由对象调用

类方法 是个自带cls参数的函数 由对象\类调用

静态方法 是个啥都不带的普通函数 由对象\类调用

property属性 是个伪装成属性的方法 由对象调用 但不加括号

3、一些内置的方法

  • new:创建一个对象的空间

    • 在实例化的时候,总是先调用 new ,在调用init

    #__new__方法
    class A:
       def __new__(cls,*args,**kwargs):
           print("执行new了")
           return super().__new__(cls)
       def __init__(self):
           print("执行init")
    A()
    • 案例

      • 设计模式

        • 单例模式:一个类从头到尾只会创建一次self的空间

        • 模块导入也是一个单例模式

        • # 单例模式  可以
          class A:
             def __new__(cls,*args,**kwargs):
                 print("执行new了")
                 return super().__new__(cls)
             def __init__(self):
                 print("执行init")
          A()

          class A:
             __flag = None
             def __new__(cls,*args,**kwargs):
                 if A.__flag is None:
                     A.__flag = super().__new__(cls)
                 return A.__flag  #下次实例化也是这个空间
             def __init__(self):
                 print("执行init")
          a = A()
          b = A()
          print(a)  #<__main__.A object at 0x000001FE989368D0>
          print(b)  #<__main__.A object at 0x000001FE989368D0>
        •  

           

  • call :对象加括号调用的是类中的双下划线call方法

    #callable
    #__call__  
    # callable() 判断是否可以被调用
    class A:
       def __init__(self,name):
           self.name = name
    class B:
       def __init__(self, name):
           self.name = name
       def __call__(self, *args, **kwargs):
           pass
    obj = A('alex')
    print(callable(obj))  #False
    print(callable(A('alex')))  #False
    print(callable(B('alex')))  #False
    '''
    __call__方法:存在call 方法,表示对象可以加()
    '''
    # A()()
    # Flask框架的源码
  • len :len一个对象,需要实现类中的双下划线len方法

    #__len__
    '''
    类中,存在__len__方法时,实例化的对象可以被len
    '''
    class Cls:
       def __init__(self,name):
           self.name = name
           self.students = []
       def len(self):
           return len(self.students)
       def __len__(self):
           return len(self.students)
    py22 = Cls('py22')
    py22.students.append('杜相玺')
    py22.students.append('庄博')
    py22.students.append('大壮')
    print(py22.len())
    print(len(py22))

    # class Pow:
    #     def __init__(self,n):
    #         self.n = n
    #     # def __pow2__(self):
    #     #     return self.n ** 2
    #
    # def pow2(obj):
    #     return obj.__pow2__()
    # obj = Pow(10)
    # print(pow2(obj))


    class Person:
       def __init__(self,name):
           self.name = name
           self.lst = []
       def add_info(self):
           return self.lst.append(self.name)
       def __len__(self):
           return len(self.lst)
    p = Person("小鱼鱼")
    p.add_info()
    print(p.lst)
    print(len(p))   # 等价于 print(len(p.lst))
                   #可以直接用len
  • eq

  • str::

    • 在打印一个对象的时候,调用str方法

    • 在%s拼接的时候,也是用的str方法

    # class Course:
    #     def __init__(self,name,price,period):
    #         self.name = name
    #         self.price = price
    #         self.period = period
    #     def __str__(self):
    #         return self.name
    # python = Course('python',21800,'6 months')
    # linux = Course('linux',19800,'5 months')
    # mysql = Course('mysql',12800,'3 months')
    # go = Course('go',15800,'4 months')
    # print(go)

    # for index,c in enumerate(lst,1):
    #     print(index,c)
    # num = int(input('>>>'))
    # course = lst[num-1]
    # print('恭喜您选择的课程为 %s 价格%s元'%(course.name,course.price))

    # class clas:
    #     def __init__(self):
    #         self.student = []
    #     def append(self,name):
    #         self.student.append(name)
    #     def __str__(self):
    #         return str(self.student)
    #
    # py22 = clas()
    # py22.append('大壮')
    # print(py22)
    # print(str(py22))
    # print('我们py22班 %s'%py22)
    # print(py22)
    # py22.append('大壮')
    # print(py22)

    # 在打印一个对象的时候 调用__str__方法
    # 在%s拼接一个对象的时候 调用__str__方法
    # 在str一个对象的时候 调用__str__方法

    class clas:
       def __init__(self):
           self.student = []
       def append(self,name):
           self.student.append(name)
       def __repr__(self):
           return str(self.student)
       def __str__(self):
           return 'aaa'

    py22 = clas()
    py22.append('大壮')
    print(py22)
    print(str(py22))
    print('我们py22班 %s'%py22)
    print('我们py22班 %r'%py22)
    print(repr(py22))
    # 当我们打印一个对象 用%s进行字符串拼接 或者str(对象)总是调用这个对象的__str__方法
    # 如果找不到__str__,就调用__repr__方法
    # __repr__不仅是__str__的替代品,还有自己的功能
    # 用%r进行字符串拼接 或者用repr(对象)的时候总是调用这个对象的__repr__方法

     

  • repr

    • 在打印一个对象的时候,调用repr方法

    • 在%r拼接的时候,也是用的repr方法

    • 是str的备胎

  • del

  • enter

  • exit

posted @ 2021-01-13 20:38  小鱼鱼与黄黄  阅读(153)  评论(0编辑  收藏  举报