Python在創建類的時候,不單單只產生了自己定義的屬性,在 內部還自動生成了一些屬性。
1、__dict__:這是一個用來記錄類屬性的字典。我們在調用函數的屬性時,本質上就是在屬性字典里直接查找。當一個類被實例化之后,實例本身只有數據屬性,並沒有函數屬性。當我們要使用實例的函數屬性時,本質上它是去調用類的函數屬性。同理實例也可以訪問類屬性。
class Student(object): '這是一個學生信息的類' school='szu' def __init__(self,name,age): self.__name=name self.__age=age def printmassage(self): print(self.__name,self.__age) s1=Student('zs',18) print(Student.__dict__) print(s1.__dict__) print(s1.school) s1.printmassage()
上面代碼的輸出如下:
{'__module__': '__main__', 'school': 'szu', '__init__': <function Student.__init__ at 0x00B3DC00>, 'printmassage': <function Student.printmassage at 0x00B3DBB8>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None} {'_Student__name': 'zs', '_Student__age': 18} szu zs 18
我們從上面可以看看出實例本身並沒有函數屬性,也沒有school屬性。但是我們去調用卻可以正常使用,本質上是在自己的屬性字典中找不到,就去類屬性找。實際上上面的調用方式可以改成下面的形式
print(Student.__dict__['school']) Student.__dict__['printmassage'](s1)
我們再來看看實例屬性和類屬性之間的關系。

class Student(object): '這是一個學生信息的類' school='szu' def __init__(self,name,age): self.__name=name self.__age=age def printmassage(self): print(self.__name,self.__age) s1=Student('zs',18) s1.school='bju' print(s1.school) #bju print(Student.school) #szu #也就是本質上是給實例增加了一個屬性。而不是去修改類屬性。 class Student(object): '這是一個學生信息的類' school='szu' ls=['a','b','c'] def __init__(self,name,age): self.__name=name self.__age=age def printmassage(self): print(self.__name,self.__age) s1=Student('zs',18) s1.ls=[1,2,3] print(s1.ls) #[1, 2, 3] print(Student.school) #['a', 'b', 'c'] #原因是跟上面一樣的,但是我們在看看下面這個例子 class Student(object): '這是一個學生信息的類' school='szu' ls=['a','b','c'] def __init__(self,name,age): self.__name=name self.__age=age def printmassage(self): print(self.__name,self.__age) s1=Student('zs',18) s1.ls.append('d') print(s1.ls) #['a', 'b', 'c', 'd'] print(Student.ls) #['a', 'b', 'c', 'd'] #這是因為沒有給實例增加一個屬性,而是直接修改類屬性
2、__doc__,描述信息。__name__ 類的名字。
class Student(object): '這是一個學生信息的類' school='szu' def __init__(self,name,age): self.__name=name self.__age=age def printmassage(self): print(self.__name,self.__age) print(Student.__name__) #Student print(Student.__doc__) #這是一個學生信息的類