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
  • 相关阅读:
    P1603 斯诺登的密码
    C++ 文件操作
    Hibernate Dialect must be explicitly set
    Dijkstra算法详解
    Php 使用 fsockopen发送http请求
    再探java基础——break和continue的用法
    Android源码的下载和编译
    ALV列、行、单元格颜色设置
    数学之路(3)-机器学习(3)-机器学习算法-欧氏距离(2)
    [poj 2926]Requirements[最远曼哈顿距离]
  • 原文地址:https://www.cnblogs.com/xuechengeng/p/9850365.html
Copyright © 2011-2022 走看看