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

目录:

  绑定与非绑定

  反射

  内置函数

绑定与非绑定方法:

类中定义函数分为了两大类:
    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  阅读(167)  评论(0编辑  收藏  举报