python学习笔记----第7章类和类型

与其它编程语言相比,Python的类机制添加了最小的新语法和语义。它是C++和Modula-3中的类机制的混合。Python的类提供了面向对象编程的所有的标准特性,类继承机制允许有多个基类,一个子类可以重写基类中的任何方法,一个方法可以调用基类里面的同名方法。对象可以包含任意数量和种类的数据。就像模块那样,类参与Python的动态天性,在运行时被创建,创建后可以被进一步修改。

创建简单类

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
27
class Employee:
'所有员工的基类'
empCount = 0 #开头没有self的数据域,且写在方法外类似于静态变量private

# 构造方法,实例化后第一时间自动调用
def __init__(self, name, salary): #注意:1、双下划线 2、是init不是int
self.name = name #开头有self的数据可以让类的其他方法使用
self.salary = salary
Employee.empCount += 1

def displayCount(self):
print "Total Employee %d" % Employee.empCount

def displayEmployee(self):
print "Name : ", self.name, ", Salary: ", self.salary

#创建实例对象
"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)

#访问属性
emp1.displayEmployee()
emp2.displayEmployee()

print "Total Employee %d" % Employee.empCount

输出结果
Name : Zara ,Salary: 2000
Name : Manni ,Salary: 5000
Total Employee 2

重绑定empCount

新的empCount值被写到emp1得特性中,屏蔽了类范围内的变量

emp1.empCount
2
emp2.empCount
2
emp1.empCount = “two”
emp1.empCount
“two”
emp2.empCount
2

类方法和静态方法

@classmethod
我们要写一个只在类中运行而不在实例中运行的方法. 如果我们想让方法不在实例中运行,可以这么做:

1
2
3
4
5
6
7
8
9
def iget_no_of_instance(ins_obj):
return ins_obj.__class__.no_inst
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print iget_no_of_instance(ik1)

输出:2

在Python2.2以后可以使用@classmethod装饰器来创建类方法.

1
2
3
4
5
6
7
8
9
10
11
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
@classmethod
def get_no_of_instance(cls_obj):
return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print ik1.get_no_of_instance()
print Kls.get_no_of_instance()

输出:
2
2
这样的好处是: 不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来.