一、常用内置函数
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
#实例化一个对象
anyan = Person('anyan',18)
1.对属性的增删改查
( 1 ).hasattr(anyan,'name') 判断属性存不存在
(2).getattr(anyan,'name') 获取属性的属性值
(3).setattr(anyan,'age',3) 无则增,有则改
(4).delattr(anyan,'sex') 删除属性
class Hunan(Person):
pass
2.其他方法
(1).issubclass(Hunan,Person) 判断前面的累是不是后面的子类
ssubclass(Hunan,object)
>>>True
(2). isinstance(anyan,Person) 判断前面的实例是不是属于后面实例出来的实例
isinstance(1,(int,float))
>>>True
(3).type(1) == int 判断数据类型,但是只能判断单个
二、属性调用方法
1.属性调用过程
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
#item 接收实例的属性
def __getattr__(self,item):
print(f'{item}实行不存在')
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
#cls代表类本身
#new用来创建实例对象的
def __new__(cls,*args,**kwargs):
print('调用实例对象')
ay = super().__new__(cls)
return ay
三、魔法方法
1.单例模式:类里面始终存在一个实例,不会同时出现多个实例
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __new__(cls,*args,**kwargs):
#如果当前类中没有这个属性
if not hasattr(cls,'_instance'):
cls._instance = super().__new__(cls)
return cls._instance
2.输出魔法方法
#__str__方法是修改print打印的样子
#__repr__方法是修改shell加护模式下的样子
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return 'this is str'
def __repr__(self):
return 'this is repr'
#将实例对象变成可调用的
def __call__(self,sum)
print(sum)
四、协议
1.序列协议:__getitem__,__len__
class IndexTuple:
def __init__(self,*args):
self.value = tuple [i for i in args]
#通过美剧方法获取下标
#enumerate()函数可以将一个可遍历对象组合成一个索引序列
#同时列出数据下标和数据值
self.index = tuple(enumerate(self.values))
#长度方法,返回方法
def __len__(self):
return len(self.values)
def __getitem__(self,key)::
return self.index[key][1]
def __repr__(self):
return str(self.values)
2.迭代器协议
class Number:
def __init__(self,end=10):
self.start = 0
self.end = end
#通过__iter__方法把类对象变成可迭代对象
def __iter__(self):
return self
#通过__next__方法把可迭代对象变成迭代器
def __next__(self):
a = self.start
if self.start>=self.end:
#主动跑出异常
raise StopIteration
self.start += 1
return a
3.上下文协议
import time
class RunTine:
#只要with语句出现,enter方法就会被触发
def __enter__(self):
#time.time()返回当时时间的时间戳
self.start_time = time.time()
rerurn self.start_time
#当__enter__方法执行后,就会执行__exit__方法
#exc_type:异常类型
#exc_val:异常值
#exc_tb:追踪信息
#只有当__enter__方法或者with中存在错误时,以上三个才会有值
def __exit__(self,exc_type,exc_val,exc_tb):
self.end_time = time.time()
self.run_time = self,end_time - self.start_time
print(f'运行时间为:{self.run_time}')