面向对象高级

基本内置函数

1.基本内置函数的增删改查

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
anyan=Person('anyan',18)

hasattr(anyan,‘name’)判断属性存不存在
getattr(anyan,‘name’)获取属性的属性值
setattr(anyan,‘age’,3)无则增,有则改
delattr(anyan,‘sex’)删除属性

2.检测属性是否存在

通过简单if 判断就能避免属性不存在时,
报错的问题,同时也可以设置属性值

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    if hasattr(anyan,'sex'):  判断属性存不存在
        a=getattr(anyan,'sex') 存在的话输出
     else:
         setattr(anyan,'sex','female')  不存在的话添加
      
anyan=Person('anyan',18)

利用三目运算获取属性值

a=(getattr(anyan,'sex') if hasattr(anyan,'sex') else setattr(anyan,'sex','female'))

3.对象关系方法
所有类都是obiect的子类

①issubcalss(hunan,Person) 判断前面的是不是后面类的子类

②isinstance(anyan,Person)判断前面的实例是不是属于后面实例出来的(前面是不是属于后面的类型)

③type(1)==int 判断数据类型,但是只能判断单个

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age

class Hunan(Person):
    pass

anyan=('anyan',18)

issubclass(Hunan,Person)
→True
isinstance(anyana,Person)
→True

4.属性调用过程

item:接收实例的属性
查找不存在的属性时不会报错,而是返回该属性不存在。

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age

   def __get__(self,item):        这个过程是重写函数
       print(f'{item}属性不存在')

魔法方法

1.先创建实例对象,再对于实例对象进行初始化

class Person:
    def __init__(self,name,age):
        print('调用初始方法')
        self.name=name
        self.age=age
        
__new__用来创建实例本身
cls 代表类本身
ay 创建出来的实例对象

   def __new__(cls,*args,**kwargs):  
       print('调用实例对象')
       ay=super().__new__(cls)
       return ay

anyan=('anyan',18)
moran=('moran',38)

→anyan is moran
→False

重写了new方法,直接调用super方法实例一个实例对象出来,创建出来的实例用变量ay接收

2.单例模式
类里面始终存在一个实例,不会同时出现多个实例。

让操作统一性。 new方法添加了if判断
例如:电脑回收站就是单例模式,loge也是

class Person:     类里面只能实例化一个对象
    def __init__(self,name,age):
        self.name=name
        self.age=age
    
    def __new__(cls,*args,**kwargs):
        if not hasattr(cls,'_instance'):   如果类里面没有_instance这个属性
        return cls._instance

anyan=('anyan',18)
moran=('moran',38)

→anyan is moran
→True

3.输出魔法方法
可以把地址值转为需要的数据(eg:元组)

str:是修改print()打印的样子 print()

repr:是修改直接打印的样子 直接回车

call:将实例对象变成可调用对象 直接加括号调用(eg:anyan())

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.num):
        num=num*10
        print(num)

anyan=('anyan',18)
moran=('moran',38)

协议

1.序列协议
有序,可下标取值
序列类型:列表,元组,字符串
dir(对象)

__getitem__
 
__len__长度方法,返回长度

class IndexTuple:
    def __init__(self,*rags):  *rags:初始化时通过不定长参数接收值
        self.values=tuple([i for i in rags])
        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)

通过枚举方法获取下标值

enumerate()函数可以将一个遍历对象组合成一个索引序列。同时列出数据下标和数据值

tu=IndexTuple('a','b','c')
tu.index
→(0,'a')

2.迭代器协议
迭代可遍历,与下标取值无关

__iter__:通过__iter__方法把类对象变成可迭代对象

__next__:通过__next__方法把可迭代对象变成迭代器,有next方法就是迭代器

raise StopIteration 主动抛出异常 ,停止迭代的意思
class Number:
    def __init__(self,end=10):
        self.start=0
        swlf.end=end
    
    def __iter__(self):
        return self
    def __next__(self):
        a=self.start   先保存初始值再循环
        if self.start>= self.end:
            raise StopIteration
        self.start+=1
        return a

调用:for i in Number(10):
             print(i)

        

3.上下文协议

__enter__:只有with语句出现,__enter__方法就会被触发

__exit__:当__enter__方法执行完毕就会执行__exit__方法

time.time()返回当前时间的时间戳

def __exit__(self,exc_type,exc_val,exc_tb)
exc_type:异常类型
exc_val:异常值
exc_tb:追踪信息
只有当__enter__方法或者with下的代码块出现异常,才会有值,否则都为None
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}')
       
with RunTime:
    for i in range(1000000):
        pass
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值