本节内容

  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方法而已,并不是有多个。

面向对象【day07】:类的属性(五)的更多相关文章

  1. Python 面向对象之一 类与属性

    Python 面向对象之 类与属性 今天接触了一下面向对象,发现面向对象和之前理解的简直就是天壤之别,在学Linux的时候,一切皆文件,现在学面向对象了,so,一切皆对象. 之前不是一直在学的用面向函 ...

  2. <九>面向对象分析之UML核心元素之设计类,类,属性,方法,可见性

    设计类

  3. java类(Class)的概念;对象的概念,声明类的属性 和方法,局部变量和成员变量,面向对象编程思维,抽象的概念

    类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网 ...

  4. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  5. java 面向对象(二十五):内部类:类的第五个成员

    内部类:类的第五个成员 1.定义: Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类.2.内部类的分类:成员内部类(静态.非静态 ) vs 局部内部类(方法内.代码块内.构 ...

  6. python面向对象-2深入类的属性

    在交互式环境中输入: >>> class A: a=0 def __init__(self): self.a=10 self.b=100 >>> a=A() > ...

  7. Python面向对象-day07

    写在前面 上课第七天,打卡: 时间的高效利用: 前言: 今天egon老师补充了下 is 和 == 的区别,整理如下:Python中变量的属性以及判断方法 一.面向过程和面向对象 - 1.面向过程 核心 ...

  8. Python之面向对象与类

    本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 子类属性查找顺序 一.面向对象的概念 1. "面向对象(OOP)"是什么? ...

  9. 【转】Python之面向对象与类

    [转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...

  10. python 面向对象与类的基本知识

    一  什么是面向对象,面向对象与类的关系. 面向对象的程序设计是用来解决扩展性. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象 ...

随机推荐

  1. 去掉ambiguous expansion of macro警告

    查看原文:http://www.heyuan110.com/?p=1221 用pod install后,pod工程里出现ambiguous expansion of macro的warning,对于有 ...

  2. laravel 多个项目共享SESSION

    只讨论一个域下的项目. eg: a.xxx.com 和 b.xxx.com 来共享session 如果多个laravel项目共享SESSION要满足以下条件: SESSION可以存放在一个地方,eg: ...

  3. SpringBoot(十七)_springboot跨域处理

    本文转自:Vi的技术博客 什么是跨域 首先,我们需要了解一下一个URL是怎么组成的: // 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 http: + // + www.baidu ...

  4. Nginx PREACCESS阶段 如何限制每个客户端每秒处理请求数

    L:56 limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;#以用户IP作为key 开辟共享内存10M 并且限制每分钟2个请求 rat ...

  5. BZOJ4182 Shopping(点分治+树形dp)

    点分治,每次考虑包含根的连通块,做树形多重背包即可,dfs序优化.注意题面给的di范围是假的,坑了我0.5h,心态炸了. #include<iostream> #include<cs ...

  6. BZOJ1127 POI2008KUP(悬线法)

    首先显然地,如果某个格子的权值超过2k,其一定不在答案之中:如果在[k,2k]中,其自身就可以作为答案.那么现在我们只需要考虑所选权值都小于k的情况. 可以发现一个结论:若存在一个权值都小于k的矩阵其 ...

  7. BZOJ5252 八省联考2018林克卡特树(动态规划+wqs二分)

    假设已经linkcut完了树,答案显然是树的直径.那么考虑这条直径在原树中是怎样的.容易想到其是由原树中恰好k+1条点不相交的链(包括单个点)拼接而成的.因为这样的链显然可以通过linkcut拼接起来 ...

  8. MySQL 5.7双主同步部分表

    参考:http://www.jb51.net/article/122892.htm?pc 前言: 我们要配置双主同步的mysql服务器. 暂时叫做,mysql1和mysql2吧. 一  mysql的配 ...

  9. 【题解】Atcoder ARC#96 F-Sweet Alchemy

    首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...

  10. 集成源码深度剖析:Fescar x Spring Cloud

    Fescar 简介 常见的分布式事务方式有基于 2PC 的 XA (e.g. atomikos),从业务层入手的 TCC( e.g. byteTCC).事务消息 ( e.g. RocketMQ Hal ...