zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    20172310 2017-2018-2 《程序设计与数据结构》第十一周学习总结
    20172310 实验四 Android程序设计
    20172310 2017-2018-2 《程序设计与数据结构》实验三报告(敏捷开发与XP实践)
    20172310 2017-2018-2 《程序设计与数据结构》第十周学习总结
    20172310 2017-2018-2 《程序设计与数据结构》第九周学习总结
    20172321 2017-2018-2 《程序设计与数据结构》实验3报告
    23172321 2017-2018-2 《程序设计与数据结构》第10周学习总结
    20172321 2017-2018-2 《程序设计与数据结构》第九次学习总结
    20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
    20172321 2017-2018-2 《程序设计与数据结构》第8周学习总结
  • 原文地址:https://www.cnblogs.com/ye-hui/p/9852477.html
Copyright © 2011-2022 走看看