• 面向对象进阶


    类成员

    字段

    • 普通字段
      • 属于对象,存储在对象空间  
      • 使用self.字段名操作  
    • 静态字段
      • 属于类,存储在类空间,如果对象有重名字段,静态字段会被覆盖  
      • 使用类名.字段名访问  
      • 使用对象名.字段名访问  

    方法

    • 普通方法
      • 由对象调用,至少一个self参数,  
      • 执行时自动将该方法的对象赋值给self  
    • 类方法
      • 定义时加上@classmethod装饰器  
      • 由类调用,至少一个cls参数  
      • 执行时自动将该方法的类赋值给cls  
    • 静态方法
      • 定义时加上@staticmethod装饰器  
      • 由类调用,无默认参数  

    属性

    普通属性
    普通方法的变种,定义普通方法时加上@property装饰器
    相关方法

    isinstance(object,classinfo)和issubclass(class,classinfo)

    isinstance用于判断object是否是classinfo、或classinfo直接、间接的子类的实例(instance),返回值为bool类型
    classinfo可以是一个包含多个类的元组,只要object按照上面的规则符合其中一个就会返回True
    issubclass用于判断class是否是classinfo、或classinfo直接、间接的子类,返回值为布尔类型

    class A:
    pass
    
    class B(A):
    pass
    
    class C(B):
    pass
    
    class D:
    pass
    
    x = C()
    # x是C的直接的实例
    print(isinstance(x, C))
    # x是B的间接的实例
    print(isinstance(x, B))
    # x不是D的实例
    print(isinstance(x, D))
    
    # classinfo可以是一个元组
    print(isinstance(x, (A, D)))
    
    # C是B的直接子类
    print(issubclass(C, B))
    # C是A的间接子类
    print(issubclass(C, A))
    # C不是D的子类
    print(issubclass(C, D))


    内置方法

    __new__
    当类开始实例化出对象时执行该方法
    正常的实例化由object类的__new__执行该方法,并返回一个对象
    通常使用该方法在实例化出对象时额外进行一些操作,然后返回object类的__new__
    class A:
    def __init__(self):
    print('in init function')
    self.x = 1

    def __new__(cls, *args, **kwargs):
    print('in new function')
    return object.__new__(A, *args, **kwargs)
    单例模式:
    一个类仅有一个对象。
    class Singleton:
    def __new__(cls, *args, **kw):
    if not hasattr(cls, '_instance'):
    cls._instance = object.__new__(cls, *args, **kw)
    return cls._instance

    one = Singleton()
    two = Singleton()
    three = Singleton()
    print(one,two,three)
    __init__
    执行__new__之后执行该方法
    __str__和__repr__
    当打印对象时,会打印str的返回值
    当str方法不存在,repr会代替str
    __del__
    当对象被del的时候执行方法
    item系列 getitem用在从对象取值的时候使用方法内的返回值,setitem用于给对象的属性赋值操作,delitem用于删除对象的属性
    __getitem__
    __setitem__
    __delitem__
    class Foo:
    def __init__(self):
    self.name = 'jack'
    self.age = 24

    def __getitem__(self, item):
    return self.__dict__[item]

    def __setitem__(self, key, value):
    self.__dict__[key] = value

    def __delitem__(self, key):
    del self.__dict__[key]
    f = Foo()
    print(f['name'])
    f['name'] = 'bob'
    del f['name']
    __call__
    定义在将对象当做函数调用时执行的方法
    __len__
    定义在对对象使用len函数时执行的方法
    __hash__
    定义在对对象使用hash函数时执行的方法
    __eq__
    定义在对两个对象使用==运算符时执行的方法
    __add__
    定义在对象相加时执行的方法
    __mul__
    定义在对象相乘时执行的方法
    __setattr__
    __getattr__
    __delattr__
    flask源码、请求上下文管理的类似本地线程功能
    比本地线程更厉害,因为可以保证协程级别的数据不混淆
    __enter__
    上下文协议入口,需要返回值
    __exit__
    上下文协议出口

    属于对象,存储在对象空间
    使用self.字段名操作

  • 相关阅读:
    线程带参数操作
    静态页面不识别include
    当网站遭遇DDOS攻击的解决方案及展望
    带进度条上传控件
    用js实现了表格数据管理的以下几个功能:
    怎么面试一个人
    map的使用
    在Axapta中实现trim函数
    Axapta财务过账分析(一)
    在Axapta中实现split函数
  • 原文地址:https://www.cnblogs.com/leiyiming/p/9194643.html
Copyright © 2020-2023  润新知