类中定义函数分为了两大类:

1.绑定方法:

  特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入

  如何用:

        绑定给对象的方法:在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的

      绑定给类的方法:为类中定义函数添加一个装饰器classmethod,就是绑定类的

2.非绑定方法:

        特殊之处:

    非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值的效果

     如何用:

    非绑定方法:为类中定义函数添加一个装饰器  staticmethod  就是非绑定方法

 

三种方法使用:关键看函数体的代码具体使用情况

import  uuid

print(uuid.uuid4())

 

1.绑定给对象的方法

    绑定给对象的,应该由对象来调,

    obj.func()

 print(obj)

绑定给对象的方法:类也可以调用,但是类调用就是一个普通函数,没有自动传值的效果

print(obj.func1)

print(Foo.func1)

Foo.func1(obj)

 

2.绑定给类的方法

绑定给类的,应该由类来调用(如用对象来调用,自动传的还是类)

print(Foo.func2)

print(obj.func2)

Foo.func2()

obj.func2()

 

3.非绑定方法

print(obj.func3)

print(Foo.func3)

obj.func3(1,2)

Foo.func3(1,3)

# class Foo:
#     def func1(self):
#         print('func1',self)
#
#     @classmethod
#     def func2(cls):
#         print('func2',cls)
#
#     @staticmethod
#     def func3(x,y):
#         print('func3',x,y)
#
# obj=Foo()
# ==========================
# 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)
#
#     @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()

 

 

反射   

  反射指的是通过字符串的形式来操作对象的相关属性

  python 中的一切事物都是对象(都可以使用反射)

hasattr    判断属性或功能是否存在

print(hasattr(obj,'name'))  #obj.name

print(hasattr(obj,'tell_info'))  #obj.tell_info

 

 

getattr   查询属性, None的位置是填默认值

res = getattr(obj,'name')   #res = obj.name

res = getattr(obj,'xxx',None)

 

 

setattr  更改  新增

setattr (obj,'age',38)

setattr(obj,'xxx',None)

 

delattr  删除

delattr(obj,'name')

 

# isinstance(obj,cls)检查是否obj是否是类 cls 的对象
# issubclass(sub, super)判断是否是子类(检查sub类是否是 super 类的派生类)
'''
# isinstance(obj,cls)检查是否obj是否是类 cls 的对象
# print(isinstance([],list)) #type([]) is list
# class Foo:
#     pass
# obj=Foo()
# print(isinstance(obj,Foo))

# issubclass(sub, super)判断是否是子类(检查sub类是否是 super 类的派生类)
# class Foo:
#     pass
#
# class Bar(Foo):
#     pass
# print(issubclass(Bar,Foo))
'''

# __str__: 会在对象被打印时自动触发,然后将返回值返回给print功能进行打印
# l=list([1,2,3])
# print(l) #(同理,定制对象的显示效果,常用!!!)

# __del__: 会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源
# 常用语回收 文件的关闭
'''
# __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)

# __del__: 会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源
# class Foo:
#     def __del__(self):
#         print('===>')
#
# obj=Foo()
# # del obj
# print('其他代码...')

# 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

 

posted on 2018-10-30 17:21  frank007  阅读(118)  评论(0编辑  收藏  举报