與@property相關的倆個 @方法.setter 修改操做 @方法.deleter 刪除一個property屬性的時候會執行被deleter裝飾的方法網絡
在類的命名空間有什麼:函數
靜態屬性,spa
方法(動態屬性),code
@property方法對象
類方法(@classmethod)blog
類方法的默認參數:cls,指的是調用這個方法的類名ip
類方法的調用方式:經過類名.類方法調用,本質就是方法 字符串
應用場景:若是你的整個方法中都沒有用到對象命名空間中的名字,且你用到了類的命名空間中的名字(普通方法和property方法除外)get
靜態方法(@staticmethod,)input
這個函數不須要默認參數self,cls
靜態方法的調用方式:經過類名.方法調用,本質是函數
應用場景:函數在類中定義的時候,即類中函數
isinstance:判斷對象與類直接的關係
判斷這個對象是否是類的對象,這個類子類的對象
issubclass(a,b):判斷類與類之間的關係,(ab都必須是類,不然報錯)
判斷這個類a是否是另外一個類b的子類
使用:getattr(變量名(命名空間),字符串(屬於一個命名空間的變量名))
定義:反射 指使用字符串數據類型的變量名來獲取這個變量的值
應用場景:
input:用戶輸入
文件:從文件中讀出的字符串,想轉換成變量的名字
網絡:將網絡傳輸的字符串轉換成年糕變量的名字
反射類的變量:靜態屬性,類方法,靜態方法
class Foo: School = "oldboy" County = "China" Language = "Chiness" @classmethod def class_method(cls): print(cls.School) def name(self): print("alex") a = Foo() while True: ch = input(">>>>>>>>>:").strip() if hasattr(a,ch): #has 判斷對象中是否存在這個方法 getattr(a,ch)() #執行方法
反射對象中的變量:對象屬性,普通方法
class Foo: def __init__(self,name,age): self.name = name self.age = age def eating(self): print("%s is eating"%self.name) a = Foo("lin",23) if hasattr(a,"name"): print(getattr(a, "name")) #lin is eating getattr(a,"eating")() #lin is eating
反射文本中的變量
import sys
sys.modules[__name__] #反射本文件中的變量,固定使用這個命名空間
import sys #加載sys模塊 a = 1 b = 2 name ="alex" def hello(): print("hello word") print(getattr(sys.modules[__name__], "a")) getattr(sys.modules[__name__],"hello")()
class Foo: Country = "China" def func(): print("hello world") Foo.Shool = "old boy" setattr(Foo,"teacher","alex") #Foo.Shool = "old boy"與他做用相同,都是給類中增長屬性 print(Foo.__dict__) # 'Country': 'China','Shool': 'old boy', 'teacher': 'alex'等
class Foo: Country = "China" def func(): print("hello world") Foo.Shool = "old boy" del Foo.Country print(Foo.__dict__) delattr(Foo,'Country') #del Foo.Country做用是同樣的 print(Foo.__dict__)