zoukankan      html  css  js  c++  java
  • 类的成员

    今日内容

    1. 私有成员 公有成员

      类的私有成员 : 私有类的静态属性,私有类的方法,私有对象的属性.

    2. 实例方法

    3. 类方法 重点

    4. 静态方法

    5. 属性 重点

    6. Issubclass 和 isinstance 区别 重要

    类的私有成员
    1. 私有类的属性

      #  在类的内部可以使用
      class A:
          name = "李烨"
          __name = "刚哥"#私有类的属性
          def func(self):
              print(self.name)
              print(self.__name)
      obj = A()   #  李烨
      obj.func()   #  刚哥 
      

      类的外部不能访问
      
      class A:
          name = "李烨"
          __name = "刚哥"#类私有属性
          def func(self):
              pass
      obj = A()
      print(obj.name)   #   李烨
      print(obj.__name) #   报错
      
     
     class A:
          name = "李烨"
          __name = "刚哥"
      class B(A):
          def func(self):
              print(self.__name)
      obj = B()
      obj.func()   # 报错
    
    私有对象属性,只能在类的内部使用,不能在类外部以及派生类使用
    class A:
        def __init__(self,name,pwd):
            self.name = name
            self.__pwd = pwd
        def md5(self):
            self.__pwd = self.__pwd + '123'
    obj = A("李业","liyedsb")
    print(obj.__pwd)  #  报错
    
    私有类的方法
    
    class A:
        def func(self):
            self.__func()
            print("in A func")
    
        def __func(self):
            print("in A __func")
    obj = A()
    obj.func()   #  两个直接输出  
    obj.__func()  #  这个就报错了,直接去找肯定不行呀
    
    私有成员来说,当你遇到重要的数据,功能(只允许本类使用的一些方法,数据)设置私有成员
    Python 所有的私有成员都是纸老虎,形同虚设
    #  类从加载时,只要遇到类中的私有成员,
    # 都会在私有成员前加上 _类名
    class A:
        name = "李烨"
        __name = "刚哥"
        def __func(self):
            print("in __func")
    print(A.__dict__)
    print(A._A__name)  #  刚哥
    

    类的其他方法

    class A:
        def func(self):
            print("实例方法")
        @classmethod
        def cls_func(cls):
            obj = cls()
            print(obj)
            print("类方法")
    obj = A()
    obj.clas_func()
    
    类方法:一般就是通过类名去调用的方法,并且自动将类名地址传递给 cls(参数),但是如果通过对象调用也可以,但是传的地址还是类名地址
    类方法有什么用?
    1. 得到类名可以实例化对象
    2. 可以操作类的属性
    3. 拿到类名,源码有一些方法可以给类开辟空间

    简单引用

    创建学生类,只要实例化一个对象,写一个类方法,统计一下具体实例化多少个学生?

    class Student:
        count = 0
        def __init__(self,name,id):
            self.name = name
            self.id = id
            Student.addnum()
    
        @classmethod
        def addnum(cls):
            cls.count = cls.count + 1
        @classmethod
        def getnum(cls):
            return cls.count
    obj = Student("liye",234535465346)
    obj = Student("weiwuxian",273638383838)
    print(Student.getnum())
    #  2
    

    静态方法

    静态方法是不依赖于对象和类的,其实静态方法就是函数

    作用:

    1. 保证代码的规范性,
    2. 合理的划分,后续维护性高.

    类方法与静态方法的区别:

    一个是函数 一个是方法

    静态不依赖于对象和类 类方法依赖本类的内存地址

    class A:
        def func(self):
            print("实例方法")
    
        @classmethod
        def cls__func(cls):
            print("好伤心呀")
        @staticmethod
        def static_func():
            print("静态方法")
    obj = A()
    obj.func()         #  实例方法
    obj.cls__func()     # 好伤心呀
    obj.static_func()   # 静态方法
    

    属性

    Property 将执行一个函数需要函数名()变成直接函数名(调用不加括号)

    将动态方法 伪装成一个属性

    组合 :

    property

    setter

    deleter

    虽然在代码级别上没有什么提升,但是让你看起来更合理

    class Bmi:
        def __init__(self,name,height,weight):
            self.name = name
            self.height = height
            self.weight = weight
        def bmi(self):
            return self.weight / self.height**2
    obj = Bmi("肖战",1.85,60)
    print(obj.bmi())
    
    结果虽然实现了,但是逻辑上感觉不合理,bim应该类似于 name,age,height 等名词,但是把它当做方法使用了
    
    class Bmi:
        def __init__(self,name,height,weight):
            self.name = name
            self.height = height
            self.weight = weight
        @property
        def bmi(self):
            return self.weight / self.height**2
    obj = Bmi("肖战",1.85,60)
    print(obj.bmi)
    
    Property  将执行一个函数需要函数名()变成直接函数名
    
    将动态方法 伪装成一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理
    
    伪装成属性后就可以怎删改查啦
    
    obj.bmi
    obj.bmi = 666
    del obj.bmi
    

    面试会考一些基本的调用,流程

    工作中如果遇到一些类似于属性的方法名,可以让其伪装成属性

    class Foo:
        @property
        def bmi(self):
            print("get的时候运行我呀")
        @bmi.setter
        def bmi(self,value):
            print(value)
        @bmi.deleter
        def bmi(self):
            print("delete 的时候运行我啊")
    obj = Foo()
    obj.bmi
    obj.bmi = 666   # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数
    # get的时候运行我呀
    # 666
    
    设置属性的两种方式

    1.利用装饰器设置属性

    class Foo:
        @property
        def bmi(self):
            print('get的时候运行我啊')
    
        @bmi.setter
        def bmi(self,value):
            print(value)
            print('set的时候运行我啊')
            # return 111  # 无法得到返回值
    
        @bmi.deleter
        def bmi(self):
            print('delete的时候运行我啊')
            # return 111  # 无法得到返回值
    obj = Foo()
    obj.bmi = 666
    #  666
    #  set 的时候运行我啊
    

    2.利用实例化对象的方式设置属性

    class Foo:
        def get_AAA(self):
            print('get的时候运行我啊')
    
        def set_AAA(self,value):
            print(value)
            print('set的时候运行我啊')
    
        def delete_AAA(self):
            print('delete的时候运行我啊')
    
        AAA = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应
    
    f1=Foo()
    f1.AAA
    f1.AAA='aaa'
    del f1.AAA  #  实际上就是调用函数
    
    get的时候运行我啊
    aaa
    set的时候运行我啊
    delete的时候运行我啊
    
    内置函数 isinstance issubclass
    # isinstance 判断的是对象与类的关系
    class A:
        pass
    
    
    class B(A):
        pass
    
    
    obj = B()
    
    # isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
    # print(isinstance(obj, B))  # True
    # print(isinstance(obj, A))  # True
    
    # issubclass 类与类之间的关系
    
    
    
    class A:
    
        pass
    
    
    
    class B(A):
    
        pass
    
    
    
    class C(B):
    
        pass
    
    
    
    # issubclass(a,b) 判断的是 a类是否是b类 或者 b类派生类 的派生类.
    
    # issubclass(a,b) 判断的是 a类是否是b类 子孙类.
    
    # print(issubclass(B,A))
    
    # print(issubclass(C,A))
    
    

    D

  • 相关阅读:
    【19】网站搭建:标签功能
    【18】网站搭建:自定义用户模型
    【17】网站搭建:Celery定时刷新缓存
    【16】网站搭建:Redis缓存提速
    【15】网站搭建:用户注册登录
    【14】网站搭建:xadmin后台强化
    【13】网站搭建:全文搜索
    C#,一种简单的方式实现滚动鼠标缩放图片,平移
    WebGIS的开发方式
    C#中找不到MouseWheel事件的解决办法
  • 原文地址:https://www.cnblogs.com/hualibokeyuan/p/11330871.html
Copyright © 2011-2022 走看看