• 面向对象【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方法而已,并不是有多个。

  • 相关阅读:
    #Laravel 笔记# 多语言化 App::setLocale() 持久化。
    thinkphp 3.2 发送邮件(Phpmailer)
    深度学习的注意力机制
    图像检索引擎vearch安装与测试使用
    word2vector
    GPU环境搭建
    ImportError: libSM.so.6: cannot open shared object file: No such file or dir
    shell中&&和||的用法
    Linux 远程连接sftp与ftp
    mysql-connector-java各版本及与mysql、JDK版本的对应
  • 原文地址:https://www.cnblogs.com/luoahong/p/7207871.html
Copyright © 2020-2023  润新知