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


python基础高级__面相对象高级

又是进步的一天

★《布宫号》提醒您:民俗信仰仅供参考,请勿过度迷信!

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复