1 使用property创建可管理的对象属性
property可以让实例在形式上是属性访问,但实际上调用方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22class Circle2(object):
def __init__(self, radius):
self.radius = radius
def getRadius(self):
# return self.radius
return round(self.radius, 2) # 表示四舍五入后保留小数点后两位
def setRadius(self, value):
if not isinstance(value, (int, long, float)):
raise valueError('wrong type .')
self.radius = float(value)
def getArea(self):
return self.radius * 2 * pi
R = property(getRadius, setRadius)
r = Circle2(3.2)
print(r.R) # 自动调用getRadius
r.R = 5.4 # 自动调用setRadius
print(r.R) # 自动调用getRadius
2.类属性和实例属性
类属性:
是可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。例如下例中,num_of_instance 就是类属性,用于跟踪存在着多少个Test 的实例。
实例属性:
实例化之后,每个实例单独拥有的变量。
1 | class Test(object): |
补充的例子
1 | class Person: |
这里p1.name="bbb"是实例调用了类属性,这其实和上面第一个问题一样,就是函数传参的问题,p1.name一开始是指向的类属性name="aaa",但是在实例的作用域里把类属性的引用改变了,就变成了一个实例属性,self.name不再引用Person的类属性name了.
可以看看下面的例子:
1 | class Person: |
参考:http://stackoverflow.com/questions/6470428/catch-multiple-exceptions-in-one-line-except-block
3.Python自省
自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().
1 | a = [1,2,3] |
4.列表解析、集合解析
代码示例如下:
1 | list1=[x for x in range(100) if x%2==0] #或 [x for x in range(0,100,2)] |
5.Python中单下划线和双下划线
1 | class MyClass(): |
__foo__:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突,就是例如__init__(),__del__(),__call__()这些特殊方法
_foo:一种约定,用来指定变量私有.程序员用来指定私有变量的一种方式.不能用from module import * 导入,其他方面和公有一样访问;
__foo:这个有真正的意义:解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名,它无法直接像公有成员一样随便访问,通过对象名._类名__xxx这样的方式可以访问.
或者: http://www.zhihu.com/question/19754941
6.字典、列表、元组、集合
1 | # 补充:集合的交集并集等操作 |
元组和列表的同异
同:列表与元组都是容器,是一系列的对象。二者都可以包含任意类型的元素甚至可以是一个序列,还可以包含元素的顺序(不像集合和字典)。
元组属于不可变对象,列表属于可变对象,列表的很多方法不适用于元组;元组可哈希而列表不可哈希;元组占用空间更小,代码的语义更好理解再函数式编程较常用。