zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SpringBoot集成MyBatisPlus
    Android 图片混排富文本编辑器控件
    Android 图片压缩器
    python中yield用法
    ubuntu下tesseract 4.0安装及参数使用
    Linux 命令行命令及参数辨异
    一题多解 —— linux 日志文件(log)reload 重新载入
    python中list用法及遍历删除元素
    计算机科学 —— 时间戳(timestamp)
    ubuntu中使用apt-get安装zbar
  • 原文地址:https://www.cnblogs.com/iaoyuyuyuhuanghuang/p/14274327.html
Copyright © 2011-2022 走看看