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__) #这是一个学生信息的类