1. 程式人生 > >python:面向對象進階

python:面向對象進階

類的屬性 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 =salary
    
def __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:面向對象進階