• 面向对象--类成员&成员修饰符


    1.成员

    • 类成员
      • 类变量
      • 绑定方法
      • 类方法
      • 静态方法
      • 属性
    • 实例成员(对象)
      • 实例变量

    1.1实例变量

    • 类实例化后的对象内部的变量

    ![1556087212183](C:Usersig cattleAppDataRoamingTypora ypora-user-images1556087212183.png)

    1.2类变量

    • 类中的变量,写在类的下一级和方法同一级。

    • 访问方法:

      • 类.类变量名称(推荐)
      • 对象.类变量名称

      ![1556087428193](C:Usersig cattleAppDataRoamingTypora ypora-user-images1556087428193.png)

    • 面试题:

      • 总结:找变量优先找自己,自己没有找 类 或 基类;修改或赋值只能在自己的内部设置。
      class Base:
          x = 1
         
      obj = Base()
      
      print(obj.x) # 先去对象中找,没有再去类中找。
      obj.y = 123  # 在对象中添加了一个y=123的变量。
      print(obj.y)
      obj.x = 123
      print(obj.x)
      print(Base.x)
      

    1.3绑定方法/普通方法

    • 定义:至少有一个self参数

    • 执行:先创建对象,由对象.方法()。

      class Foo:
          def func(self,a,b):
              print(a,b)
              
      obj = Foo()
      obj.func(1,2)
      # ###########################
      class Foo:
          def __init__(self):
              self.name = 123
      
          def func(self, a, b):
              print(self.name, a, b)
      
      obj = Foo()
      obj.func(1, 2)
      

    1.4静态方法

    • 定义:
      • @staticmethod装饰器
      • 参数无限制
    • 调用:
      • 类.静态方法名()
      • 对象.静态方法名()不推荐
    • 在方法不进行传参时使用
    class Foo:
        def __init__(self):
            self.name = 123
    
        def func(self, a, b):
            print(self.name, a, b)
    
        @staticmethod
        def f1():
            print(123)
    
    obj = Foo()
    obj.func(1, 2)
    
    Foo.f1()
    obj.f1() # 不推荐
    

    1.5类方法

    • 定义:

      • @classmethod装饰器
      • 至少有cls一个参数,当前类
    • 执行

      • .方法()
      • 对象.类方法()不推荐
      class Foo:
          def __init__(self):
              self.name = 123
      
          def func(self, a, b):
              print(self.name, a, b)
      
          @staticmethod
          def f1():
              print(123)
      
          @classmethod
          def f2(cls,a,b):
              print('cls是当前类',cls)
              print(a,b)
      
      obj = Foo()
      obj.func(1, 2)
      
      Foo.f1()
      Foo.f2(1,2)
      
    • 面试题

      # 问题: @classmethod和@staticmethod的区别?
      """
      一个是类方法一个静态方法。 
      定义:
      	类方法:用@classmethod做装饰器且至少有一个cls参数。
      	静态方法:用staticmethod做装饰器且参数无限制。
      调用:
      	类.方法直接调用。
      	对象.方法也可以调用。 
      """
      

    1.6属性

    • 定义:
      • @property装饰器
      • 只有一个self参数
    • 调用:
      • 对象.方法 不加括号
    class Foo:
    
        @property
        def func(self):
            print(123)
            return 666
    
    obj = Foo()
    result = obj.func
    print(result)
    
    • 属性的应用

      # 属性的应用
      
      class Page:
          def __init__(self, total_count, current_page, per_page_count=10):
              self.total_count = total_count
              self.per_page_count = per_page_count
              self.current_page = current_page
          @property
          def start_index(self):
              return (self.current_page - 1) * self.per_page_count
          @property
          def end_index(self):
              return self.current_page * self.per_page_count
      
      
      USER_LIST = []
      for i in range(321):
          USER_LIST.append('alex-%s' % (i,))
      
      # 请实现分页展示:
      current_page = int(input('请输入要查看的页码:'))
      p = Page(321, current_page)
      data_list = USER_LIST[p.start_index:p.end_index]
      for item in data_list:
          print(item)
      

    2.成员修饰符

    2.1 公有

    • 公有,所有地方都能访问到。

      class Foo:
          def __init__(self, name):
              self.__name = name
      
          def func(self):
              print(self.__name)
      
      
      obj = Foo('alex')
      # print(obj.__name)
      obj.func()
      

    2.2 私有

    • 私有,只有自己可以访问到。

      class Foo:
          __x = 1
      
          @staticmethod
          def func():
              print(Foo.__x)
      
      
      # print(Foo.__x)
      Foo.func()
      
      #---------------------------------------------
      class Foo:
      
          def __fun(self):
              print('msg')
      
          def show(self):
              self.__fun()
      
      obj = Foo()
      # obj.__fun()
      obj.show()
      
      

    2.3强制访问私有成员

    # 强制访问私有成员
    
    class Foo:
        def __init__(self,name):
            self.__x = name
    
    
    obj = Foo('alex')
    
    print(obj._Foo__x) # 强制访问私有实例变量
    
    

    3.内容补充

    • py2/3区别:

    • class Foo:
          pass
      
      class Foo(object):
          pass
      
      # 在python3中这俩的写法是一样,因为所有的类默认都会继承object类,全部都是新式类。
      
      
      # 如果在python2中这样定义,则称其为:经典类
      class Foo:
          pass 
      # 如果在python2中这样定义,则称其为:新式类
      class Foo(object):
          pass 
      
      class Base(object):
          pass
      class Bar(Base):
          pass
      
      
    • class Foo:
          def __init__(self,num):
              self.num = num
              
              
      cls_list = []
      for i in range(10):
          cls_list.append(Foo)
          
      for i in range(len(cls_list)):
          obj = cls_list[i](i)
          print(obj.num)
      
      

    总结:

    • 数据封装

    • 继承关系查找

    • 嵌套

      class School(object):
          def __init__(self,title,addr):
              self.title = title
              self.address = addr
              
      class ClassRoom(object):
          
          def __init__(self,name,school_object):
              self.name = name
              self.school = school_object
              
      s1 = School('北京','沙河')
      s2 = School('上海','浦东')
      s3 = School('深圳','南山')
      
      c1 = ClassRoom('全栈21期',s1)
      c1.name
      c1.school.title
      c1.school.address
      # ############################################
      v = [11,22,33,{'name':'山海','addr':'浦东'}]
      
      v[0]
      v[3]['name']
      
      
  • 相关阅读:
    听说你的MES系统又失败了?
    GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解
    对 MES 感兴趣?赶紧看过来!
    SQL 高级查询(层次化查询,递归)
    智能制造概念
    简单又实用的分享!SharePoint母版页引用(实战)
    原创分享!SharePoint母版页修改(实战)
    入门者必看!SharePoint之CAML总结(实战)
    新手必看!Office Web Apps 2013 安装与配置(实战)
    SharePoint布局页引用(实战)
  • 原文地址:https://www.cnblogs.com/bigox/p/10771132.html
Copyright © 2020-2023  润新知