基础知识回顾:属性

Python一切皆对象(object),每个对象都可能有多个属性(attribute)。其属性可能来自类定义或类继承,这叫类属性,也可能来自实例对象的属性,这叫实例属性

不同实例的实例属性可能不同,不同实例的类属性都相同。所以一般把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。

属性

定义属性:类.属性 = 值 或者 实例.属性 = 值

调用属性:类().属性() 或者 实例.属性() 或者 实例.属性

 1 >>> class Person:
 2       def think(self):
 3           print "To be or not to be is a question"
 4
 5 >>> class Women(Person):
 6       def gender(self):
 7           print "she may be a girl or a lady"
 8
 9
10 >>> Ryana = Women()        #实例化一个子类Women对象Ryana
11 >>> Ryana.think()         #通过实例.属性()调用
12 To be or not to be is a question  
13 >>> Women().gengder()    #通过类().属性()调用,类()等价于类实例
14 she may be a girl or a lady
15 >>> Ryana.age = 18          #定义实例属性
16 >>> Person.speak = ‘hello‘    #类之外,定义类属性
17 >>> Ryana.speak         #注意没有(),因为调用的是类的字符串属性,不是类方法
18 ‘hello‘
19 >>> Person.__dict__
20 {‘__module__‘: ‘__main__‘, ‘speak‘: ‘hello‘, ‘think‘: <function think at 0x03DEDEF0>, ‘__doc__‘: None}
21 >>> women.__dict__
22 {‘gengder‘: <function gengder at 0x03DEDF30>, ‘__module__‘: ‘__main__‘, ‘__doc__‘: None}
23 >>> Ryana.__dict__
24 {‘age‘: 18}
25 >>> Echo = Person()         #实例化一个父类Person对象Echo
26 >>> Echo.think()
27 To be or not to be is a question
28 >>> Echo.speak
29 ‘hello‘
30 >>> Echo.gender       #类的继承方式由下到上
31
32 Traceback (most recent call last):
33   File "<pyshell#20>", line 1, in <module>
34     Echo.gengder
35 AttributeError: Person instance has no attribute ‘gender‘
36 >>> Echo.__dict__
37 {}

查询类或对象的属性除了访问类的字典属性 __dict__,还可以用内建函数dir()查看类或者对象的所有属性。

>>> dir(Person)
[‘__doc__‘, ‘__module__‘, ‘speak‘, ‘think‘]
>>> dir(Women)
[‘__doc__‘, ‘__module__‘, ‘gengder‘, ‘speak‘, ‘think‘]

从上面的属性可知,除了类自定义的属性,还有__doc__,__module__,这类属性称为特殊属性,常见的特殊属性有:

 1 >>> women.__bases__  #类的所有父类构成的元组
 2 (<class __main__.Person at 0x03834ED8>,)
 3 >>> women.__doc__     #类的文档字符串
 4 >>> women.__name__   #类的名字(字符串)
 5 ‘women‘
 6 >>> women.__module__  #类定义所在的模块
 7 ‘__main__‘
 8 >>> Ryana.__class__    #实例对应的类
 9 <class __main__.women at 0x03C7A5E0>

类属性与实例属性冲突

 1 >>> class f:
 2       a = 10
 3
 4 #实例化对象obj1和obj2从类f继承属性a
 5 >>> obj1 = f()
 6 >>> obj2 = f()
 7 >>> print obj1.a , obj2.a , f.a
 8 10 10 10
 9
10 #实例化对象obj1自定义实例属性obj1.a = 12
11 >>> obj1.a = obj1.a + 2   #等价于obj1.a += 2
12 >>> print obj1.a , obj2.a , f.a
13 12 10 10
14
15 #改变类f的属性,由于对象obj1的实例属性a和类f的类属性a命名冲突,所以对象obj1将屏蔽类属性
16 >>> f.a = f.a + 3
17 >>> print obj1.a , obj2.a , f.a
18 12 13 13

Python中属性是按照从下到上的顺序来查找;当删除实例属性后,再使用相同的名称,访问到的将是类属性。

时间: 2024-11-04 17:13:29

基础知识回顾:属性的相关文章

JS基础知识回顾:引用类型(一)

在ECMAScript中引用类型是一种数据结构,用于将数据和功能组织在一起,而对象时引用类型的一个实例. 尽管ECMAScript从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构,所以虽然说引用类型与类看起来想死,但他们并不是相同的概念. 不过引用类型有的时候也可以被称为对象定义,因为他们描述的是一类对象所具有的属性和方法. 新对象是使用new操作符后跟一个构造函数来实现的,构造函数本身就是一个函数,只不过该函数时处于创建新对象的目的而定义的. ECMASc

JS基础知识回顾:在HTML中使用JavaScript

想HTML页面中插入JavaScript的主要方法就是使用<script>元素. HTML4.01当中为<script>元素定义了下列6个属性: language(已废弃):原来用于表示编写代码使用的脚本语言,如JavaScript.JavaScript1.2.VBScript等,由于大多数浏览器会忽略此属性,因此就没有必要再用了: type(可选):可以看成是language的替代属性,表示编写代码使用的脚本语言的内容类型,也被称作MIME类型,在未指定此属性的情况下会被默认为t

JS基础知识回顾:ECMAScript的语法(一)

任何语言的核心都必然会描述这门语言最基本的工作原理,而描述的内容通常都要涉及这门语言的语法.操作符.数据类型.内置功能等用于构建复杂解决方案的基本概念. ECMAScript中的一切变量.函数名.操作符都区分大小写. ECMAScript的标识符要符合下列规则:第一个字符必须是字母.下划线或美元符号:其他字符可以是字母.下划线.美元符号或数字. 标识符中的字母也可以包含扩展的ASCII或Unicode字母字符,但是并不推荐. 按照惯例,ECMAScript标识符采用驼峰大小写的格式来书写,尽管没

java基础知识回顾之关键字

其实java中的常用关键字并不多,总共加起来也没有多少个,具体见如下这张表: private,protect,public 在java中,在类,类的属性和累的方法前面加上一个修饰符来对其进行访问权限上的控制.除了使用private,protect,public之外, 还有一种是default情况,即使不加任何权限修饰符.关于这四中情况的权限差别见下表: 注意:default不是修饰符,他表示一种不加任何修饰符的情况. 这里,主要看一看static,instanceof,final关键字的含义和如

JS基础知识回顾:引用类型(四)

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法. 由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 函数的声明有以下三种形式: function sum(num1,num2){return num1+num2;}//利用函数声明语法定义 var sum=function(num1,num2){return num1+num2;}//利用函数表达式定义 var sum=new Function("num1","nu

JS基础知识回顾:变量、作用域和内存问题

ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指的是那些可能由多个值构成的对象. 引用类型的值是保存在内存中的对象,与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间. 在操作对象时,实际上是在操作对象的引用而不是实际的对象. 在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的,ECMAScript放弃了这一传统. 定义基本类型值和引用类型值的方式是类似的:创建

java基础知识回顾之面向对象

一 . 抽象类 什么是抽象类?很简单,就是用abstract关键字修饰,并允许包含未实现方法的类. 什么时候定义抽象类?在有些情况下,可能有些方法无法确定要怎么实现,这时就可以定义抽象类,无法实现的方法定义成抽象方法. 抽象类的特性: 1. 不能实例化,即不能创建对象,只能作为父类被继承. 2. 子类继承一个抽象类后,必须实现父类的抽象方法. 3. 抽象类中可以有抽象方法,也可以不包含抽象方法,但如果包含抽象方法,就必须定义成抽象类. public abstract class Shaoe{ p

JS基础知识回顾:引用类型(三)

ECMAScript通过RegExp类型来支持正则表达式. 使用类似Perl的语法就可以创建一个正则表达式:var expression=/pattern/flags; 其中模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类.限定符.分组.向前查找以及反向引用. 每个正则表达式都可以带有一个或多个标志(flags),用以标注正则表达式的行为. 正则表达式的匹配模式只是下列三个标志: g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即

JS基础知识回顾:ECMAScript的语法(二)

ECMAScript中有五种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String ECMAScript还有一种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的. ECMAScript不支持任何创建自定义类型的机制,而所有值最终都将是上述六种数据类型之一,由于ECMAScript的数据类型具有动态性,因此的确没有再定义其他数据类型的必要了. 监狱ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据

java基础知识回顾之java集合类-Properties集合

/** java.lang.Object   |--java.util.Dictionary<K,V>      |--java.util.Hashtable<Object,Object>          |--java.util.Properties * @author Administrator *Properties集合:         * 特点:         * 1,该集合中的键和值都是字符串类型.         * 2,集合中的数据可以保存到流中,或者从流加载