类和对象的方法
一、绑定方法和非绑定方法
类中定义的函数分为两大类:绑定方法和非绑定方法
-
绑定方法:分为绑定到类和对象的方法,绑定给谁,就应该由谁来调用,谁来调用就回把调用者当作第一个参数自动传入
-
绑定到对象的方法:在类内定义的没有被任何装饰器修饰的
-
绑定到类的方法:在类内定义的被装饰器classmethod修饰的方法
-
-
非绑定方法:没有自动传值这么一说了,就类中定义的一个普通工具,对象和类都可以使用
- 非绑定方法:为类中某个函数加上装饰器@staticmethod,不与类或者对象绑定
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