类中定义的函数分为两大类:绑定方法和非绑定方法
绑定方法:分为绑定到类和对象的方法,绑定给谁,就应该由谁来调用,谁来调用就回把调用者当作第一个参数自动传入
绑定到对象的方法:在类内定义的没有被任何装饰器修饰的
绑定到类的方法:在类内定义的被装饰器classmethod修饰的方法
非绑定方法:没有自动传值这么一说了,就类中定义的一个普通工具,对象和类都可以使用
class Foo:
def __init__(self, name):
self.name = name
def tell(self):
print(‘名字是%s‘ % self.name)
@classmethod
def func(cls): # cls=Foo
print(cls)
@staticmethod
def func1(x, y):
print(x + y)
# 实例对象调用对象的绑定方法
f = Foo(‘tester‘) # 名字是tester
f.tell() # 3
# 实例对象调用静态方法(非绑定方法)
f.func1(1, 2)
# 实例的对象调用类方法
f.func() # <class ‘__main__.Foo‘>
# 类调用类方法(绑定方法)
Foo.func() # <class ‘__main__.Foo‘>
# 类调用静态方法
Foo.func1(2, 3) # 5
@staticmethod ,把类里面的函数设置为静态方法,即为非绑定发放
@classmethod,被装饰的方法设置为类方法,类方法的第一个参数指向类对象自己
@property,把方法当成属性一样去使用
class People:
def __init__(self, name):
self.__name = name
@property
def name(self):
# print(‘getter‘)
return self.__name
@name.setter
def name(self, val):
# print(‘setter‘,val)
if not isinstance(val, str):
print(‘名字必须是字符串类型‘)
return
self.__name = val
@name.deleter
def name(self):
print(‘deleter‘)
print(‘不允许删除‘)
p = People(‘tester‘)
p.name = ‘aa‘
print(p.name) # aa
del p.name
python是动态语言,而反射(reflection)机制被视为动态语言的关键。反射机制指的是在程序的运行状态中
对于任意一个类,都可以知道这个类的所有属性和方法;
对于任意一个对象,都能够调用他的任意方法和属性。
这种动态获取程序信息以及动态调用对象的功能称为反射机制。
反射的核心本质就是以字符串的形式去导入一个模块,利用字符串的形式去执行函数。
反射:通过字符串映射到对象的属性、方法、模块
反射的应用
class Service:
def run(self):
while True:
inp = input(‘>>: ‘).strip() # cmd=‘get a.txt‘
cmds = inp.split() # cmds=[‘get‘,‘a.txt‘]
# print(cmds)
if hasattr(self, cmds[0]):
func = getattr(self, cmds[0])
func(cmds)
def get(self, cmds):
print(‘get.......‘, cmds)
def put(self, cmds):
print(‘put.......‘, cmds)
obj = Service()
obj.run()
hasattr(object,name)
判断object中有没有一个name字符串对应的方法或属性
getattr(object, name, default=None)
def getattr(object, name, default=None): # known special case of getattr
"""
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, ‘y‘) is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn‘t
exist; without it, an exception is raised in that case.
"""
pass
setattr(x, y, v)
def setattr(x, y, v): # real signature unknown; restored from __doc__
"""
Sets the named attribute on the given object to the specified value.
setattr(x, ‘y‘, v) is equivalent to ``x.y = v‘‘
"""
pass
delattr(x, y)
def delattr(x, y): # real signature unknown; restored from __doc__
"""
Deletes the named attribute from the given object.
delattr(x, ‘y‘) is equivalent to ``del x.y‘‘
"""
pass
原文:https://www.cnblogs.com/snailrunning/p/14358755.html