python学习的第27天面向对象之绑定与非绑定、反射、内置方法

一、绑定方法与非绑定方法

类中定义函数分为了两大类:
1. 绑定方法
特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入

绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的
绑定给类的方法: 为类中定义函数添加一个装饰器classmethod,就是绑定类的

2. 非绑定方法
特殊之处: 非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果
非绑定方法: 为类中定义函数添加一个装饰器staticmethod,就是非绑定方法

#绑定方法:
# 1、对象绑定类,调用函数时候自动传值,类可以调用函数,但要自己传值给参数,
# 函数需要的参数一个不能少
# obj=Fool()
# obj.func1()  #func1 <__main__.Fool object at 0x0000000001F87470>
# Fool.func1(Fool)    #func1 <class '__main__.Fool'>

#2、类绑定类,在函数上面添加装饰器classmethod,类调用函数时候会自动传值,
#对象也能调用被绑定类的函数,自动传值,原理是用对象的那个类调用被绑定类的函数
# Fool.func2()       #func2 <class '__main__.Fool'>
# obj=Fool()
# obj.func2()        #func2 <class '__main__.Fool'>
#非绑定方法 staticmethod
#3、在类中的函数上面添加装饰器staticmethod,那个函数与对象、类都不绑定,也就是说不能自动传值
#调用时候要当普通函数使用,有多少参数就传多少参数
# obj=Fool()
# obj.fun3('egon')    #fun3 egon
# Fool.fun3('hu')     #fun3 hu

3、为什么要用类绑定,和非绑定方法

创造一个类,可以读取配置文件的IP和port,可以从从配置文件实现实例化(创造一个对象),给每个对象一个ID

import setting
class MySQL:
    def __init__(self,ip,port):
        self.ip=ip
        self.port=port
        self.id=self.UID()
    def tell(self):
        print('ip:%s port:%s id:%s' %(self.ip,self.port,self.id))
    @classmethod                #从配置文件实现实例化(创造一个对象)
    def From_con(cls):
         return cls(setting.IP,setting.PORT)

     #给每个对象一个ID 独立完成功能   可以用uuid模块
    @staticmethod
    def UID():
        import uuid
        return  uuid.uuid4()

二,反射

1、什么是反射

反射指的是通过字符串来操作属性

2、怎么用

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

    def tell_info(self):
        print('%s:%s' %(self.name,self.age))

obj=Foo('egon',18)
#hasattr                       判断是否有该属性
# print(hasattr(obj,'name')) #obj.name
# print(hasattr(obj,'tell_info')) #obj.tell_info

#getattr                       查看该属性
# res=getattr(obj,'name') #res=obj.name
# print(res)
# res=getattr(obj,'xxx',None)
# print(res)

#setattr                       修改、增加该属性
# setattr(obj,'age',38)
# setattr(obj,'sex','male')
# print(obj.__dict__)
# print(obj.sex)

#delattr                       删除该属性
# delattr(obj,'name')
if hasattr(obj,'xxxxe'):
    delattr(obj,'xxxxe')
# print(obj.__dict__)

三、常用内置方法

PS:内置函数

isinstance()判断一个对象是不是另一个类的实例(对象)

issubclass()判断一个类是不是另一个类的子类

1、__str__

会在对象被打印时自动触发,然后将返回值返回给print功能进行打印

# class People:
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#
#     def __str__(self):                                 
#         return '<%s:%s>' %(self.name,self.age)     #必须返回字符串类型
#
# peo=People('egon',18)
# print(peo) #print(peo.__str__())
#
# l=list([1,2,3])                                   list的本质是个类,也有__str__,所以实例化过程中没有显示出内存地址
# print(l)

2、__del__

会在对象呗删除时自动触发执行,用来在对象被删除前回收系统资源

class Bar:
    def __init__(self,x,y,filepath):
        self.x=x
        self.y=y
        self.f=open(filepath,'r',encoding='utf-8')
    def __del__(self):
        # 写回收系统资源相关的代码
        self.f.close()       #删除前回收系统资源

obj=Bar(10,20)
del obj

猜你喜欢

转载自www.cnblogs.com/ye-hui/p/9852477.html