python基础高级__面相对象高级(python基础语言)
一,
1,常用内置函数
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print(f'{self.name}在吃饭')
lili=Person('lili',8)
if hasattr(lili,'sex'):#判断lili这个对象是否有sex属性
print(getattr(lili,'sex'))#获取lili这个对象的sex属性
else:
print('该对象没有这个属性')
setattr(lili,'sex','girl')
hasattr(lili,'sex')
True
delattr(lili,'sex')
hasattr(lili,'sex')
False
2,
属性调用过程
'''
dir(lili)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'eat', 'name']
dir(object)#object(超类、基类)类是所有类的父类,所有的类都会继承于object类
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print(f'{self.name}在吃饭')
def __getattr__(self,item):
print('没有这个属性')
lili=Person('lili',8)
2,1
属性的调用过程
有一个实例对象lili
lili.sex(获取莉莉对象的sex属性)
1、判断是否存在sex属性
有:调用__getattribute__('属性') 获取对象的指定属性值
没有:调用__getattr__将要操作的属性传进该方法
如果没有定义__getattr__ object类没有 自己的类也没有定义,就会报错
有定义就不会报错,所以需要自己写一个__getattr__方法
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print(f'{self.name}在吃饭')
#item参数,将要获取的属性传入进来
def __getattr__(self,item):
print('没有这个属性')
lili=Person('lili',8)
3,对象关系方法
3,1
所有的数据类型本质都是一个类
str 类 字符串类
int 类 整形类
'abc' 对象 是字符串类的对象
1 对象 是整形类的对象
3,2
(交互模式展现)
>>> issubclass(Person,object)#判断第一个类型时不是后面类的子类
>>> True
>>> isinstance(lili,Person)#判断对象是否是该类的实例化对象
>>> True
>>> isinstance(1,int)
>>> True
>>> type(1)==int
>>> True
>>> type(lili)==Person
>>> True
>>> type(1)==int or type(1)==str#type只能进行一种类型的判断,如果要进行多种的话就需要用逻辑运算符
>>> True
>>> isinstance(1,(int,str))#isinstance能够进行多种类型的判断,中间的逗号是or不能做and
>>> True
>>> #type类型会更严谨一些,是不会兼容父类的,因为type是得到这个数据是什么类型的,是不会判断他是否继承了哪些父类的,
>>> #isinstance是包含父类的
>>> type(lili)==object
>>> False
>>> isinstance(lili,object)
>>> True
4,魔法方法
外观:两个下划线开头 两个下划线结尾 中间是单词
作用:魔法方法神奇的地方在于不需要自己调用,会在某种特定的场景自动执行,是由Python解释器执行
魔法方法只需要定义,自动在符合规则的场景下自动调用
class Earth:
def __new__(cls):
print('new',cls)
return super().__new__(cls)
def __init__(self):
print('init')
e=Earth()
__new__什么时候被调用:实例化自动调用 是第一个被调用的方法,在初始化执行会影响初始化
作用:创建对象是由__new__方法执行的,是用来创建对象的
Earth()创建对象的正确步骤:
1。调用object类的__new__方法创建指定类的对象
2.对该对象进行初始化,调用_init__方法
先给new创建,然后把创建好的给init初始化
5,单例模式
class Earth:
def __new__(cls):
#cls就是一个参数,前面打印出来看到的是自己定义的类
#类点属性(cls.instance)保存的是下面的实例化对象(super().__new__())
#cls.instance=super().__new__()
#判断要创建对象的类有没有instance属性,如果没有则说明没有创建对象
if not hasattr(cls,'instance'):
#调用object的new方法创建对象并保存到instance属性
cls.instance=super().__new__(cls)
return cls.instance#返回创建的对象
def __init__(self):
self.name='lili'
e=Earth()#第一次实例对象,没有instance属性,就创建对象
a=Earth()#第二次实例对象,有instance属性,返回第一次创建的
#作用:想要一个对象修改,类的其他实例对象也会进行修改,就用单例模式
c=Earth()
6,输出魔法方法
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self):
print(f'{self.name}在吃饭')
def __getattr__(self,item):
print('没有这个属性')
def __str__(self):#对应print输出
return '{name:%s,age:%s}'%(self.name,self.age)
#不想要访问莉莉对象的输出地址值,重写repr方法
def __repr__(self):#对应return输出
#return f'姓名:{self.name},年龄:{self.age}'#不推荐
return '{name:%s,age:%s}'%(self.name,self.age)
def __call__(self):
print('call')
lili=Person('lili',8)
'''
#总结:什么时候使用两个输出魔法方法,想要输出的不是地址值的时候使用
#__call__将对象作为函数调用的时候执行
二,协议
1,序列协议
class IndexList:
def __init__(self,*args):
#在实例化对象的时候就可以拿到传进来的值,所以写在初始化函数里面
#通过列表推导式快速生成一个列表
self.values=list([i for i in args])
print(self.values)
#通过枚举方法获取下标值
#enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据下标和数据
self.index=list(enumerate(self.values))
#长度方法,返回长度
def __len__(self):
return len(self.values)
#__getitem__()方法
def __getitem__(self,key):
return self.index[key][1]
def __setitem__(self,key,value):
self.values[key]=value
def __delitem__(self,key):
#self.pop(key)
del self.values[key]
def __repr__(self):
return str(self.values)
li=IndexList(1,2,3,4,5)
2,迭代器协议
#列表 元祖等都只是可迭代对象 不是迭代器,需要通过iter内置函数转出迭代器
#迭代器可以通过next内置函数依次获取到里面的内容
'''
class MyRang:
#end指的是遍历的次数,默认遍历10次,也可以自己给值
def __init__(self,end=10):
self.start=0
self.end=end
def __iter__(self):#将MyRang类变成可迭代对象
return self
#迭代器就可以通过next内置函数依次获取到里面的内容
def __next__(self):#将MyRang变成迭代器
res=self.start
if self.start==self.end:
#如果初始值等于遍历次数的时候,也就是循环结束的时候,抛出异常,中断整个程序
raise StopIteration
#将数据一个一个迭代出来
self.start+=1
#把遍历到的数据返回出来
return res
a=MyRang(10)
for i in MyRang(10):
print(i)
3,上下文协议
#上下文协议会自动的去调用,不需要你自己去调用。并且自动清理/释放代码块中程序占用的资源
'''
class RunTime:
def __enter__(self):
print('开始')
def __exit__(self,exc_type,exc_val,exc_tb):
print('结束')
with RunTime():
print('执行程序')
'''
'''
import time
class RunTime:
def __enter__(self):
self.start_time=time.time()
return self.start_time
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}')
#现在计算机的处理时间是很快的,所以for循环的次数要尽量往大写,不然出来的时间就会是0.0,也就是时间忽略不计了。
with RunTime():
[i for i in range(100000)]:
pass
又是进步的一天
★《布宫号》提醒您:民俗信仰仅供参考,请勿过度迷信!