zoukankan      html  css  js  c++  java
  • 面向对象【day07】:类的属性(五)

    本节内容

    1. 概述
    2. 公有属性

    一、概述

      前面我们讲了类的私有属性,现在我们来说说类的公有属性,这边很容易被人弄混淆,有人觉的,在__init__()构造方法中,除了私有属性,其他的都是公有属性了,其实这是一个错误的结论,并不是定义在__init__()初始化方法中的属性是公有属性(除私有属性),那什么是公有属性呢?揭起了大家的好奇心。

      定义:指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性。

    二、公有属性

    2.1 定义

    说明:在类中直接定义的,可以提供这个类所属的所有对象都可以访问的属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class dog(object):
        "dog class"
     
        nationality = "JP"   #定义公有属性nationality
     
        def __init__(self,name):
            self.name = name
     
    d1 = dog("alex")
    d2 = dog("sanjiang")
    print(d1.nationality,d2.nationality)  #所有的成员变量都可以访问
     
    #输出
    JP JP

    这边有个小疑问,d1.name,d2.name也可以访问,也可以修改, 为什么不能叫公有属性呢?代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class dog(object):
        "dog class"
     
        nationality = "JP"
     
        def __init__(self,name):
            self.name = name
     
    d1 = dog("alex")
    d2 = dog("sanjiang")
    print(d1.name,d2.name)
     
    #输出
    alex sanjiang

    很明显,上面的name是每个对象的属性,并不是共享,而是独立的 。

    2.2 类访问公有属性

    说明:公有属性不仅可以通过所属类的所有对象访问,还可以通过类本身直接访问和修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class dog(object):
        "dog class"
     
        nationality = "JP"  #定义公有属性
     
        def __init__(self,name):
            self.name = name
     
    d1 = dog("alex")
    d2 = dog("sanjiang")
    print(dog.nationality)  #访问公有属性
    dog.nationality = "US"  #修改公有属性
    print(dog.nationality)
     
    #输出
    JP
    US

    2.3 公有属性特性

    说明:公有属性不是私有属性,它提供所有对象访问和修改,那我们其中有一个对象正在修改公共属性发生什么变化呢?或者类本身直接修改了公共属性,又放生什么变化呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class dog(object):
        "dog class"
     
        nationality = "JP"
     
        def __init__(self,name):
            self.name = name
     
    d1 = dog("alex")
    d2 = dog("sanjiang")
    print("firsthand change...")
    print(d1.nationality,d2.nationality)
    print("brfore change ...")
    d1.nationality = "CN"    #对象的d1修改公共属性得值
    print(d1.nationality,d2.nationality)
    print("after change ....")
    dog.nationality = "US"    #dog类本省修改公共属性的值
    print(d1.nationality,d2.nationality)
     
    #输出
    firsthand change...
    JP JP
    brfore change ...
    CN JP          #d1对象的公共属性被修改了
    after change ....
    CN US    #d1对象的公共属性值没有随着类本身的公共属性值修改而修改

     我去,看的我头昏眼花的。。。好吧,下面我就一张图来说明一下:

     

    对上面的图做一下总结:

    1. 对象d1去访问nationality属性时,如果在成员属性中找不到,就会找公共属性,也就是说自己的属性找不到就去找父亲的属性
    2. d1.nationality="CN" 相当于在自己对象内部又重新创建了一个新的局部变量,这个局部变量已经脱离了class本身,跟这个类已经没有半毛钱关系了,只是名字一样而已,如果不改,还是找全局的。

    2.4 公有属性和方法的疑惑

      从上面我们可以看出公有属性只有一个,而且是在没有定义对象的时候,就已经存在,那么类中的方法是不是每调用一次,就会生成一个呐?答案是肯定不会的。

      就是说,你去实例化然后调用sayhi方法,只是拿着这块内存中的数据去调公有的sayhi方法而已,并不是有多个。

  • 相关阅读:
    Hibernate save, saveOrUpdate, persist, merge, update 区别
    Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
    Neo4j批量插入(Batch Insertion)
    嵌入式(Embedded)Neo4j数据库访问方法
    Neo4j 查询已经创建的索引与约束
    Neo4j 两种索引Legacy Index与Schema Index区别
    spring data jpa hibernate jpa 三者之间的关系
    maven web project打包为war包,目录结构的变化
    创建一个maven web project
    Linux下部署solrCloud
  • 原文地址:https://www.cnblogs.com/luoahong/p/7207871.html
Copyright © 2011-2022 走看看