Python类的内置函数

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']

#这是因为没有给实例增加一个属性,而是直接修改类属性
View Code

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__)    #这是一个学生信息的类
原文地址:https://www.cnblogs.com/linshuhui/p/9012424.html