绑定与非绑定,反射,内置方法

本文深入解析Python中的绑定与非绑定方法、反射及内置方法。详细介绍了绑定方法与非绑定方法的区别,包括绑定对象方法、绑定类方法和非绑定静态方法,并通过示例代码展示其调用方式。同时,探讨了如何通过字符串操作属性,以及常用内置方法如isinstance、issubclass、__str__和__del__的功能与应用。

绑定与非绑定,反射,内置方法

目录:

  绑定与非绑定

  反射

  内置函数

绑定与非绑定方法:

类中定义函数分为了两大类:
    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

 

posted @ 2018-10-25 15:53 ChuckXue 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值