• python基础1-类属性和实例属性


    类属性就是类对象所拥有的属性,它被所有类对象实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象实例对象访问

    类属性

    class people:
        name = 'Tom'  #公有的类属性
        __age = 12     #私有的类属性
    
    p = people()
    
    print p.name             #正确
    print people.name        #正确
    print p.__age            #错误,不能在类外通过实例对象访问私有的类属性
    print people.__age       #错误,不能在类外通过类对象访问私有的类属性
    

    实例属性

    实例属性是不需要在类中显示定义的,比如:

    class people:
        name = 'Tom'
    
    p = people()
    p.age =12
    print p.name    #正确
    print p.age     #正确
    
    print people.name    #正确
    print people.age     #错误
    

    在类外对类对象people进行实例化之后,产生了一个实例对象p,然后p.age = 12这句给p添加了一个实例属性age,赋值为12。这个实例属性是实例对象p所特有的,注意,类对象people并不拥有它(所以不能通过类对象来访问这个age属性)。当然还可以在实例化对象的时候给age赋值。

    class people:
        name = 'Tom'
    
        #__init__()是内置的构造方法,在实例化对象时自动调用
        def __init__(self,age):
            self.age = age
    
    p = people(12)
    print p.name    #正确
    print p.age     #正确
    
    print people.name    #正确
    print people.age     #错误
    

    如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性

    class people:
        country = 'china'
    
    
    print people.country
    p = people()
    print p.country
    p.country = 'japan' 
    print p.country      #实例属性会屏蔽掉同名的类属性
    print people.country
    del p.country    #删除实例属性
    print p.country
    

    总结

    对于类属性和实例属性,如果在类方法中引用某个属性,该属性必定是类属性,而如果在实例方法中引用某个属性(不作更改),并且存在同名的类属性,此时若实例对象有该名称的实例属性,则实例属性会屏蔽类属性,即引用的是实例属性,若实例对象没有该名称的实例属性,则引用的是类属性;如果在实例方法更改某个属性,并且存在同名的类属性,此时若实例对象有该名称的实例属性,则修改的是实例属性,若实例对象没有该名称的实例属性,则会创建一个同名称的实例属性。想要修改类属性,如果在类外,可以通过类对象修改,如果在类里面,只有在类方法中进行修改。

  • 相关阅读:
    Vue-router的实现原理
    get请求被浏览器跨域的同源策略请求机制拦截,但是get请求是否请求到了服务器呢
    合并两个有序链表
    JS实现链式调用 a().b().c()
    CSS知识点总结
    BK-信息查找、摘取
    radar图生成用户guideline
    【转】 mybatis 详解(七)------一对一、一对多、多对多
    【转】 mybatis 详解(六)------通过mapper接口加载映射文件
    【转】 mybatis 详解(五)------动态SQL
  • 原文地址:https://www.cnblogs.com/byron0918/p/6864273.html
Copyright © 2020-2023  润新知