zoukankan      html  css  js  c++  java
  • 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__)    #这是一个学生信息的类
  • 相关阅读:
    读取Web.config文件中的配置信息类
    屏蔽页面中的右键操作
    树型目录
    自己常用的分页SQL
    c#用一个线程同步的简单例子

    c++面向对象学习
    数据上传项目总结
    简单的xml学习
    c#中跨线程使用控件
  • 原文地址:https://www.cnblogs.com/linshuhui/p/9012424.html
Copyright © 2011-2022 走看看