Python 類和對象 Class vs Object
類別定義
class 類別名:
例如:
>>> class Point:
... x = 0.0
... y = 0.0
1. 宣告
>>> p1 = Point()
>>> p1.x, p1.y
(0.0, 0.0)
2. 賦値
>>> p1.x = 5.0
>>> p1.y = 6.0
>>> p1.x, p1.y
(5.0, 6.0)
3. 位址指向
>>> p1
<__main__.Point object at 0x00000000021B22E8>
>>> id(p1.x)
30060832
>>> id(p1.y)
30060808
4. 別名 Alias
>>> p2 = p1
>>> id(p1)
>>> id(p2)
>>> p1 == p2
True
5. 複製 Copy
>>> id(p1)
>>> import copy
>>> p3 = copy.copy(p1)
>>> id (p3)
>>> p1 == p3
False
6. 物件嵌入物件
>>> class Phone:
... area_code = 0
... number = 0
...
>>> class Person:
... name = ''
... age = 0
... phone = Phone()
...
>>> p1 = Person()
>>> p1.name = 'John'
>>> p1.age = 20
>>> p1.phone.code = 2
>>> p1.phone.number = 995576
>>> id(p1)
31859152
>>> p2 = Person()
>>> p2.name = 'Mary'
>>> p2.age = 38
>>> p2.phone.code = 3
>>> p2.phone.number = 773322
>>> id(p2)
31859264
>>> import copy
>>> print(p1.name,p1.age,p1.phone.code,p1.phone.number)
John 20 3 773322
>>> print(p2.name,p2.age,p2.phone.code,p2.phone.number)
Mary 38 3 773322
>>>
注意到沒? 雖然 p1 與 p2 是不同的物件,但卻共享相同的物件 Phone,所以 p2.Phone 更新時, p1.Phone 也同樣更新,p1.Phone 與 p2.Phone 共享一個位址。
事實上 p1 與 p2 的 Phone 並沒有在 RAM 中被分配 Allocate 空間存儲,所以才有這現象。我們必須以 p1.Phone() 與 p2.Phone() 各自分配存儲空間,例如:
>>> p1.phone = Phone()
>>> p1.phone.code = 2
>>> p1.phone.number = 995576
>>> print(p1.name,p1.age,p1.phone.code,p1.phone.number)
John 20 2 995576
>>> p2.phone = Phone()
>>> p2.phone.code = 3
>>> p2.phone.number = 773322
>>> print(p2.name,p2.age,p2.phone.code,p2.phone.number)
Mary 38 3 773322
>>>
7. 物件複製 Copy
>>> import copy
>>> p2 = copy.copy(p1)
>>> print(p1.name,p1.age,p1.phone.code,p1.phone.number)
John 20 2 995576
>>> print(p2.name,p2.age,p2.phone.code,p2.phone.number)
John 20 2 995576
>>> id(p1)
31859152
>>> id(p2)
31859656
>>> p1 == p2
False
/end
Python 類和對象 Class vs Object的更多相关文章
- pycharm install python packaging tools时遇到AttributeError: '_NamespacePath' object has no attribute 'sort'错误
pycharm install python packaging tools时报错AttributeError: '_NamespacePath' object has no attribute 's ...
- Python 類別 class 的繼承 Inheritance
既然 Python 是面向物件 Object Oriented 語言,它就有類別 Class 與物件 Object 的概念. 甚麼是類別 class ? 簡單講: 類別好比蓋房子的施工藍圖 Blue ...
- python中使用zip函数出现<zip object at 0x02A9E418>
在Python中使用zip函数,出现<zip object at 0x02A9E418>错误的原因是,你是用的是python2点多的版本,python3.0对python做了改动 zip方 ...
- Python学习札记(四十) 面向对象编程 Object Oriented Program 11
参考:使用元类 NOTE: type() 1.type()函数可以用于检查一个类或者变量的类型. #!/usr/bin/env python3 class Myclass(object): " ...
- Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property
参考:@property NOTE 1.在绑定参数时,为了避免对属性不符合逻辑的操作,需要对传入的参数进行审核. #!/usr/bin/env python3 class MyClass(object ...
- Python学习札记(三十三) 面向对象编程 Object Oriented Program 4
参考:继承和多态 NOTE 著名的开闭原则: 对扩展开放:允许新增Animal子类: 对修改封闭:不需要修改依赖Animal类型的Animal_func()等函数. 1.eg. #!/usr/bin/ ...
- Python学习札记(三十一) 面向对象编程 Object Oriented Program 2
参考:类和实例 注意理解第七点. NOTE: 1.类是抽象的模板,比如Student类,实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. ...
- Python之运算符以及基本数据类型的object
一.运算符 1.算术运算符 % 求余运算 ** 幂-返回x的y次幂 // 取整数-返回商的整数部分,例:9//2输出结果是4 2.比较运算符 == 等于 != 不等于 <> 不等于 ...
- python调用WebService遇到的问题'Document' object has no attribute 'set'
代码: from suds import WebFault from suds.client import Client url = 'http://******/bns/PtDataSvc.asmx ...
随机推荐
- Android 基于ksoap2的webservice请求的学习
[学习阶段] WebService网络请求? 其实我也是第一次遇到,之所以有这个需要是因为一些与 ERP 相关的业务,需要用到这样的一个请求方式. 开始学习WebService ①当然是百度搜索,这里 ...
- inux 网络监控分析
一.sar -n:查看网卡流量 -n 参数,他有6个不同的开关:DEV | EDEV | NFS | NFSD | SOCK | ALL .DEV显示网络接口信息,EDEV显示关于网络错误的统计数据, ...
- JavaScript-作用域与作用域链
一.JavaScript作用域: 1.就是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性更重要是减少命名冲突. 2.js的作用域(es6)之前,分为全局作用域.局部作用域 ...
- java之java.io.File的相关方法
java.io.File的使用. IO原理及流的分类. 文件流:FileInputStream.FileOutputStream.FileReader.FileWriter 缓存流:BufferedI ...
- Redux学习及应用
Redux学习及应用 一:Redux的来源? Redux 是 JavaScript 状态容器,提供可预测化的状态管理.Redux是由 Flux 演变而来,但受 Elm 的启发,避开了 Flux 的复杂 ...
- Linux - CentOS 7 通过Yum源安装 Nginx
添加源 sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.no ...
- PlayJava Day025
JTable 用JTable类可以以表格的形式显示和编辑数据 JTable类的对象并不存储数据,它只是数据的表现 MVC 数据.表现和控制三者分离,各负其责 M = Model(模型) V = Vie ...
- 剑指offer笔记面试题1----赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public: CMyString(char* pData = nullptr); CMyS ...
- Android UI开发之开源控件项目整理
一.Banner 1.https://github.com/youth5201314/banner Android广告图片轮播控件,支持无限循环和多种主题,可以灵活设置轮播样式.动画.轮播和切换时间. ...
- windows系统搭建zookeeper
安装&配置 在apache的官方网站提供了好多镜像下载地址,然后找到对应的版本 下载地址: http://mirrors.cnnic.cn/apache/zookeeper/zookeeper ...