__str__
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# __str__: 在对象被打印时自动触发,可以用来定义对象被打印时的输出信息
# 注意:必须返回一个字符串类型的值
# class People:
# def __init__(self, name, age):
# self.name = name
# self.age = age
#
# def __str__(self): #当执行print(obj1)的时候,这个方法就是触发
# # print('run..........') #这条print语句也会打印
# return '<name:%s age:%s>' % (self.name, self.age) #打印出来的就不是个object的内存地址了,就是按照return的形式打印
# obj1 = People('egon', 18)
# print(obj1) # print(obj1.__str__())
# obj2=list([1,2,3])
# print(obj2)
__del__
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# __del__: 在对象被删除时先自动触发该方法,可以用来回收对象以外其他相关资源,比如系统资源
# class Foo:
# def __init__(self,x,filepath,encoding='utf-8'):
# self.x=x
# self.f=open(filepath,'rt',encoding=encoding) #f对应着一个被打开的文件
#
# def __del__(self): 当执行del obj的时候,这个方法就是触发
# print('run.....') #这句话也会被打印
# # 回收对象关联的其他资源
# self.f.close() #如果单纯的删掉对象,那么被打开的文件资源不会立即被回首。所以需要在__del__方法里,关闭打开的文件资源。
#
# obj=Foo(1,'a.txt')
# # del obj
# print('主===========>')
__call__
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# __call__: 在对象被调用时会自动触发该方法,可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符。
class Foo:
def __init__(self,x,y):
self.x=x
self.y=y
def __call__(self, *args, **kwargs):
print(self,args,kwargs)
obj=Foo(1,2)
obj(1,2,a=3,b=4) #obj.__call__(obj,1,2,a=3,b=4)
#反射:通过字符串来反射/映射到对象/类的属性上
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def run(self):
print('%s is running' %self.name)
obj=People('egon',18)
# print(obj.__dict__)
# print(obj.name) #obj.__dict__['name']
# obj.name='EGON' #obj.__dict__['name']='EGON'
#
# del obj.name # del obj.__dict__['name']
#
# obj.sex='male' #obj.__dict__['sex']='male'
# attr=input('>>>: ').strip() #attr='name'
# obj.'name'
# print(hasattr(obj,'name')) # 'name' in obj.__dict__ #看obj有没有"name"这个属性
# print(getattr(obj,'name')) # obj.__dict__['name'] #获得obj里的属性"name"的值,找不到会报错
# print(getattr(obj,'xxx',None)) # obj.__dict__['xxx'] #获得obj里的属性"name"的值,找不到会返回None
# setattr(obj,'name','EGON') #obj.__dict__['name']='EGON' #设置obj里的属性"name"的值为"EGON",没有则添加,有的话就覆盖
# setattr(obj,'xxx',1111) #obj.__dict__['xxx']=111
# print(obj.name)
# print(obj.__dict__)
# delattr(obj,'name')
# print(obj.__dict__)
# import os
# os.remove
# print(hasattr(os,'remove'))
class Ftp:
def get(self):
print('get')
def put(self):
print('put')
def login(self):
print('login')
def run(self):
while True:
cmd=input('>>>: ').strip() #cmd='get'
if hasattr(self,cmd): #如果此对象有"cmd"这个属性
method=getattr(self,cmd) #就拿到这个这个属性的内存地址,付给一个新的值
method() #调用
else:
print('输入的方法不存在')
obj=Ftp()
obj.run()