在类内部定义的函数,分为两大类
一:绑定方法:绑定给谁,就应该由谁来调用,就会把调用者当作第一个参数自动传入
- 绑定到对象的方法:在类内定义的没有被装饰器修饰的
- 绑定到类的方法:在类的内部定义的被装饰器classmethod修饰的方法
二:非绑定方法:没有自动传值这么一说,就是类中定义的一个普通工具,对象和类都可以使用
- 非绑定方法:不与类或者对象绑定
View Code
绑定方法与非绑定方法的应用
View Code
反射
反射:通过字符串映射到对象的属性
class People:
country = 'china'
def __init__(self,name,age):
self.name = name
self.age = age
def talk(self):
print('%s is talking' %self.name)
obj = People('egon',18)
print(obj.name) # __init__(obj) name是属性,不是字符串
print(obj.talk)
# choice = input('>>:') #choice='name'
# print(obj.choise) #print(obj.'name')
#判断
print(hasattr(obj,'name')) #判断obj.name #本质上是去判断obj.__dict__['name']
print(hasattr(obj,'talk')) #判断obj.talk
# 获取
print(getattr(obj,'namexx',None))
print(getattr(obj,'talk',None))
# 修改|新增
setattr(obj,'sex','male') #obj.sex='male'
print(obj.__dict__)
print(obj.sex)
# 删除
delattr(obj,'age') #del obj.age
print(obj.__dict__)
####类和对象的用法大同小异
# print(getattr(People,'country')) #People.country
反射的应用
可以用于对用户输入的字符进行判断
用处:接受用户的输入触发对象的某一个方法
总结:通过字符串来访问到对象或类的数据属性和函数属性
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]): #判断是否有cmd的属性 func = getattr(self,cmds[0]) func(cmds) def get(self,cmds): print('get.....',cmds) def put(self,cmds): print('set.....',cmds) obj = Service() obj.run()
内置方法
1.isinstance() isinstance(f,Foo) 什么是什么的对象
2.issubclass() issubclass(Foo,Bar) 什么是什么的子类
3.item系列: 把对象做成一个像字典对象那样 像字典对象那样访问数据
- 查看属性 def __getitem__(self, item): obj['name'] 触发
- 设置属性 def __setitem__(self, key, value): obj['sex']='male' 触发
- 删除属性 def __delitem__(self, key): del obj['name']
class Bar: pass class Foo(Bar): pass f=Foo() # print(isinstance(f,Foo)) # print(issubclass(Foo,Bar)) # print(issubclass(Bar,Foo)) # item 系列 class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): # return self.__dict__[item] # 若是没有 会报错 return self.__dict__.get(item) def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): del self.__dict__[key] def __str__(self): return '<name:%s>'%self.name def __del__(self): # self.close() print('回收操作系统的 资源') obj=Foo('alice') # print(obj.__dict__) # print(obj.name) # print(obj['name']) # obj['name']='aaaa' # print(obj.__dict__) # del obj['name'] # print(obj.__dict__) # obj.sex='12' # print(obj.__dict__) # print(obj) # del obj # print('---main---') 内置方法