面向对象进阶
Posted leiyiming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象进阶相关的知识,希望对你有一定的参考价值。
类成员
字段
- 普通字段
- 属于对象,存储在对象空间
- 使用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.字段名操作
以上是关于面向对象进阶的主要内容,如果未能解决你的问题,请参考以下文章