zoukankan      html  css  js  c++  java
  • python 面向对象(四)--实例属性和类属性

    由于Python是动态语言,根据类创建的实例可以任意绑定属性。

    给实例绑定属性的方法是通过实例变量,或者通过self变量:

    1 class Student(object):
    2     def __init__(self, name):
    3         self.name = name
    4 
    5 s = Student('Bob')
    6 s.score = 90
    7 print(s.score)

    但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有:

    1 class Student(object):
    2     name='Student'
    3     def __init__(self, score):
    4 
    5         self.score = score
    6 
    7 s = Student(90)
    8 print(s.score)
    9 print(s.name)

    运行结果:

    90
    Student

    当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。来测试一下:

    class Student(object):
        name='Student'
        def __init__(self, score):
    
            self.score = score
    
    s = Student(90)# 创建实例
    print(s.score)
    print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
    print(Student.name) # 打印类的name属性
    s.name = 'Michael' # 给实例绑定name属性
    print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
    print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
    del s.name # 如果删除实例的name属性
    print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了

    运行结果:

    1 90
    2 Student
    3 Student
    4 Michael
    5 Student
    6 Student

    从上面的例子可以看出,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

     

    目前还在学习中,希望会对大家有所帮助,觉得不错,就点赞支持一下。 另外,转载时请附带链接。谢谢!
  • 相关阅读:
    树链剖分 (模板) 洛谷3384
    ST表 (模板) 洛谷3865
    IOI 2005 River (洛谷 3354)
    IOI 2005 River (洛谷 3354)
    poj1094 Sorting It All Out
    poj1094 Sorting It All Out
    spfa(模板)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    洛谷1850(NOIp2016) 换教室——期望dp
  • 原文地址:https://www.cnblogs.com/dangkai/p/9527896.html
Copyright © 2011-2022 走看看