zoukankan      html  css  js  c++  java
  • 绑定与非绑定,反射,内置方法

    目录:

      绑定与非绑定

      反射

      内置函数

    绑定与非绑定方法:

    类中定义函数分为了两大类:
        1. 绑定方法
            特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入
            绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的
            绑定给类的方法: 为类中定义函数添加一个装饰器classmethod,就是绑定类的
    
        2. 非绑定方法
            特殊之处: 非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果
            非绑定方法: 为类中定义函数添加一个装饰器staticmethod,就是非绑定方法

     示例代码:

    class Foo:
        # 绑定对象
        def func1(self):
            print('func1',self)
        # 绑定类
        @classmethod
        def func2(cls):
            print('func2',cls)
        # 非绑定方法,必须明确加staticmethod
        @staticmethod
        def func3(x,y):
            print('func3',x,y)
    obj=Foo()

    一:绑定给对象的方法

    #绑定给对象的,应该由对象来调,
    obj.func1()
    print(obj)
    
    #绑定给对象的方法,类也可以调用,但是类调用就是一个普通函数,没有自动传值的效果
    print(obj.func1)
    print(Foo.func1)
    Foo.func1(obj)

    二:绑定给类的方法

    # 绑定给类的,应该由类来调,对象调用跟类调用没有区别
    print(Foo.func2)
    print(obj.func2)
    Foo.func2()
    obj.func2()

     三:非绑定方法

    # 非绑定方法就相当于一个普通的函数,类和对象调用都一样
    print(obj.func3)
    print(Foo.func3)
    obj.func3(1,2)
    Foo.func3(1,3)

      两种方法,三种情况:具体使用绑定方法还是非绑定方法要根据函数代码确定

    
    
    settings.py
    IP='10.10.0.11'
    PORT=3307
    import settings
    class MySQL:
        def __init__(self,ip,port):
            self.id=self.create_id()
            self.ip=ip
            self.port=port
       #需要传入对象,所以绑定对象
        def tell_info(self):
            print('<%s:%s:%s>' % (self.id,self.ip,self.port))
       #需要传入类名,所以绑定类
        @classmethod
        def from_conf(cls):
            return cls(settings.IP, settings.PORT)
        #生成ID,不需要传值,非绑定方法
        @staticmethod
        def create_id():
            import uuid
            return uuid.uuid4()
    
    obj=MySQL('1.1.1.1',3306)
    # obj1=MySQL('1.1.1.2',3406)
    obj.tell_info()
    # obj1.tell_info()
    
    obj2=MySQL.from_conf()
    obj2.tell_info()

    反射:通过字符串来操作属性

    定义类:

    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)

    四个方法:

     1 #hasattr,判断是否有该属性
     2 print(hasattr(obj,'name')) #obj.name
     3 print(hasattr(obj,'tell_info')) #obj.tell_info
     4 
     5 #getattr,获得属性
     6 res=getattr(obj,'name') #res=obj.name
     7 print(res)
     8 res=getattr(obj,'age',None)#第三个参数 用来防止报错
     9 print(res)
    10 
    11 #setattr,改或者增加属性
    12 setattr(obj,'age',38)
    13 setattr(obj,'sex','male')
    14 print(obj.__dict__)
    15 print(obj.sex)
    16 
    17 #delattr,删除属性
    18 delattr(obj,'name')
    19 delattr(obj,'age')
    20 if hasattr(obj,'xxxxe'):
    21     delattr(obj,'xxxxe')
    22 print(obj.__dict__)

    内置方法:

    判断是否为对象或子类:

    # isinstance()判断是否是某个类的实例
    print(isinstance([],list)) #type([]) is list  True
    class Foo:
        pass
    obj=Foo() print(isinstance(obj,Foo))#True # issubclass()判断是否是某个类的子类 class Foo: pass class Bar(Foo): pass
    print(issubclass(Bar,Foo) 

    __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])
    print(l)#调用了内部的__str__方法

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

     1 class Foo:
     2     def __del__(self):
     3         print('===>')
     4 obj=Foo()
     5 del obj
     6 print('其他代码...')
     7 # ===>
     8 # 其他代码...
     9 
    10 -----------------------
    11 class Foo:
    12     def __del__(self):
    13         print('===>')
    14 obj=Foo()
    15 print('其他代码...')
    16 # 其他代码...
    17 # ===>
    18 # 程序结束的时候会自动调用__del__方法,
    19 
    20 -----------------------------------------
    21 class Bar:
    22     def __init__(self,x,y,filepath):
    23         self.x=x
    24         self.y=y
    25         # 打开一个文件,没有关闭
    26         self.f=open(filepath,'r',encoding='utf-8')
    27     def __del__(self):
    28         # 写回收系统资源相关的代码,在程序结束时自动执行.从而关闭文件
    29         self.f.close()
    30 31 obj=Bar(10,20,r'G:filename') 32 del obj
  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 洁净数
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    20. Valid Parentheses
    290. Word Pattern
    205. Isomorphic Strings
    71. Simplify Path
  • 原文地址:https://www.cnblogs.com/xuechengeng/p/9850365.html
Copyright © 2011-2022 走看看