文档章节

python之类属性和实例对象属性

fanzc
 fanzc
发布于 2012/11/15 23:53
字数 912
阅读 1246
收藏 2

python中的实例对象属性(Instance Attributes)就是跟这个对象绑定的简单的数据而已。实例对象属性一般在__init__函数中初始化,但是在其它方法中也是可以随意添加新的属性。

class Foo(object):
    def __init__(self, name):
        super(Foo, self).__init__()
        self.name = name    // 实例对象属性

    def fun(self):
        self.sugar = "whatever"    // 给实例添加属性,但并不提倡这么做,所有的实例属性最好在__init__中给出
需要注意的是,self指代是实例化后对象。


类属性可以理解为跟类绑定的数据,跟实例无关,但是我们可以通过实例化对象引用类属性。python核心编程中有一句描述我认为描述不当。(When an instance is created, Python provides a default, read-only instance attribute which is an alias to the class attribute.)实际上,当实例化对象的时候,新的实例得到是类属行的一个引用,这个引用不能说是可读的,可读不可读都是针对所引用的这个属性是否可变,数字,字符串是不可边的数据类型,而list或者自定义对象等都是可变类型。为了更好的表达,我用一个例子来说明:

In [5]: class Foo:
   ...:     count = 0
   ...:     lst = [1, 6, 3, 2, 9]
   ...:     def __init__(self, name="foo"):
   ...:         self.name = name
   ...:         
   ...:
In [10]: Foo.count
Out[10]: 0

In [11]: Foo.lst
Out[11]: [1, 6, 3, 2, 9]

In [12]: id(Foo.count), id(Foo.lst)    // 类属性的地址
Out[12]: (141233524, 144539980)

In [13]: f1 = Foo()

In [14]: id(f1.count), id(f1.lst)    // 实例对象属性的地址
Out[14]: (141233524, 144539980)    // 新创建的对象的属性跟类属性执行同一地址的数据

In [15]: f1.lst
Out[15]: [1, 6, 3, 2, 9]

In [16]: f1.lst.sort()    // 这里对lst属性做原地排序,

In [17]: f1.lst    // 排序后的结果
Out[17]: [1, 2, 3, 6, 9]

In [18]: Foo.lst    // 通过实例更改了类的可变属性,说明引用不是只读的
Out[18]: [1, 2, 3, 6, 9]

In [19]: id(f1.lst), id(Foo.lst)  
Out[19]: (144539980, 144539980)    // 通过实例更改类的可变属性后,类属性和实例对象属性地址不变
In [20]: f1.lst = []

In [21]: f1.count += 100

In [23]: id(f1.count),id(Foo.count),id(f1.lst), id(Foo.lst)
Out[23]: (141234300, 141233524, 144488652, 144539980)    // 任何针对实例对象的赋值语句都会接触类属性的版定,而新建一个新的同名实例对象属性


参考: core python programing, dive into python

这里是相关摘要:

Class Attributes and Intance Attributes

class attributes are simply data values associated with a class and not any particular instances like instance attributes are. Such values are also referred to as static members because their values stay constant, even if a class is invoked due to instantiation multiple times. No matter what, static members maintain their values independent of instances unless explicitly changed. Comparing instance attributes to class attributes is almost like the comparison between automatic and static variables, if you are familiar with these concepts from other languages.

There are a few aspects of class attributes versus instance attributes that should be brought to light. The first is that you can access a class attribute with either the class or an instance, provided that the instance does not have an attribute with the same name.

Any type of assignment of a local attribute will result in the creation and assignment of an instance attribute, just like a regular Python variable. If a class attribute exists with the same name, it is overridden in the instance. (compare with list.sort() or list.reverse() function).

Binding and Method Invocation.

Now we need to readdress the Python concept of binding, which is associated only with method invocation. We will first review the facts about methods. First, a method is simply a function defined as part of a class. This means that methods are class attributes (not instance attributes). Second, methods can be invoked only when there is an instance of the class in which the method was defined. When there is an instance present, the method is considered bound. Without an instance, a method is considered unbound. And third, the first argument in any method definition is the variable self, which represents
the instance object which invokes the method.












© 著作权归作者所有

fanzc
粉丝 1
博文 11
码字总数 4350
作品 0
杭州
私信 提问
Python3 与 C# 面向对象之~封装

最新彩版:https://www.cnblogs.com/dotnetcrazy/p/9202988.html 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在线预览:http://github.lesschina.com/python/base/oop/1......

毒逆天
2018/06/20
0
0
关于Python类属性与实例属性的讨论

标题名字有点长。 之所以想写这个文章是因为碰巧看到网上一篇关于Pyhon中类属性及实例属性区别的帖子。因为我之前也被这个问题困扰过,今天碰巧看到了这篇帖子,发现帖子的作者只是描述了现象...

_Zhao
2018/08/27
0
0
史上最全的Python面向对象知识点疏理

面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 类变量:类变量在整个实例化的对象中是公用的。类变量定义...

乐乎无趣
2017/11/03
46
0
Python - 进阶(持续更新 ing)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/qq39437555/article/details/93867588 文章目录 Python - 面向对象 ...

桃子味儿的汽水~
08/23
0
0
python 面向对象编程之类和实例

python学习笔记,特做记录,分享给大家,希望对大家有所帮助。 类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创...

展菲
07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

网站安全维护公司对渗透测试php后门分析

很多想做渗透测试的朋友都想了解关于PHP后门漏洞的安全测试重点方法,以及该如何预防被中php后门,本节由我们的Sine安全高级渗透工程师进行全面的讲解,来让大家更好的理解和了解php代码的安全...

网站安全
14分钟前
7
0
在github上创建代码仓库时忘记添加.gitignore文件或修改了.gitignore该怎么办?

#清除本地缓存(改变成未track状态) #git rm -r --cached . 表示清除项目中所有文件的本地缓存 git rm -r --cached xxx #xxx表示不想版本控制的文件,比如小编可以输入test.o #.gitignore中的...

博爱飞扬
15分钟前
6
0
Fsimage 与 EditLog定义及合并过程

有很多客户端在向 hdfs 中写数据,同时有很多客户端在查数据,这就涉及到一个响应速度问题。因为只有一个 namenode ,客户端在写的时候,必须迅速记下来。 1. 向 namenode 询问可以存储到哪些...

Garphy
18分钟前
5
0
TI KeyStone C66x开发板处理器、NAND FLASH、NOR FLASH

TL6678F-EasyEVM是广州创龙基于SOM-TL6678F核心板而研发的一款多核高性能DSP+FPGA开发板。开发板采用核心板+底板方式,底板采用沉金无铅工艺的8层板设计,尺寸为247.33mm*139.8mm,它为用户提...

Tronlong创龙
36分钟前
5
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第13题

Choose the best answer. Examine this query: SELECT TRUNC (ROUND(156.00,-2),-1) FROM DUAL; What is the result? A) 16 B) 160 C) 150 D) 200 E) 100 Answer:D (解析:关键就是 round ......

oschina_5359
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部