python:面向對象進階
阿新 • • 發佈:2018-01-22
類的屬性 lar obj [] bsp mod teacher 函數 __del__
1,反射
反射:使用字符串類型的名字去操作變量 反射就沒有安全問題,去操作內存中已經存在的變量 #反射對象中的屬性和方法class A: price=20 print(getattr(A,‘price‘))
#反射對象的屬性
class A: def func(self): print(‘in func‘) a =A() a.name =‘alex‘ ret =getattr(a,‘name‘)#通過變量名的字符串形式取到的值 print(ret)#反射對象的方法
ret =getattr(a,‘func‘) ret()
#反射類的方法:
if hasattr(A,‘func‘)): getattr(A,‘func‘)()
#反射類的屬性
class A: price=20 print(getattr(A,‘price‘))
#反射模塊的屬性
import my print(getattr(my,‘day‘))#反射自己模塊中的變量
import sys print(getattr(sys.modules[‘__main__‘],‘year‘)) getattr(sys.modules[‘__main__‘],‘qqxing‘)()
setattr設置/修改變量
class A:pass setattr(A,‘name‘,‘alex‘) print(A,name)
delattr刪除變量
delattr(a,‘name‘)
2,__str__和__repr__
改變對象的字符串顯示__str__,__repr__
自定制格式化字符串__format__
# 雙下方法 # obj.__str__ str(obj) # obj.__repr__ repr(obj)
class Teacher: def __init__(self,name,salary): self.name =name self.salary =salarydef __str__(self): return "Teacher‘s object :%s"%self.name def __repr__(self): return str(self.__dict__) def func(self): return ‘wahaha‘ nezha =Teacher(‘nazha‘,250) print(nazha) print(repr(nezha)) print(‘>>> %r‘%nezha)
#object 裏有一個__str__,一旦被調用,就返回調用這個方法的#對象的內存地址 l = [1,2,3,4,5] # 實例化 實例化了一個列表類的對象 print(l) # %s str() 直接打印 實際上都是走的__str__ # %r repr() 實際上都是走的__repr__ # repr 是str的備胎,但str不能做repr的備胎 # print(obj)/‘%s‘%obj/str(obj)的時候,實際上是內部調用了obj.__str__方法,如果str方法有,那麽他返回的必定是一個字符串 # 如果沒有__str__方法,會先找本類中的__repr__方法,再沒有再找父類中的__str__。 # repr(),只會找__repr__,如果沒有找父類的
class Classes: def __init__(self,name): self.name = name self.student = [] def __len__(self): return len(self.student) def __str__(self): return ‘classes‘ py_s9= Classes(‘python全棧9期‘) py_s9.student.append(‘二哥‘) py_s9.student.append(‘泰哥‘) print(len(py_s9)) print(py_s9)
#__del__ class A: def __del__(self): # 析構函數: 在刪除一個對象之前進行一些收尾工作 self.f.close() a = A() a.f = open() # 打開文件 第一 在操作系統中打開了一個文件 拿到了文件操作符存在了內存中 del a # a.f 拿到了文件操作符消失在了內存中 del a # del 既執行了這個方法,又刪除了變量
# __call__ class A: def __init__(self,name): self.name = name def __call__(self): ‘‘‘ 打印這個對象中的所有屬性 :return: ‘‘‘ for k in self.__dict__: print(k,self.__dict__[k]) a = A(‘alex‘)()
python:面向對象進階