1 面向对象编程的基本思想
2.类的定义与创建实例
在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类如下:
class Person(object):
pass
按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。类的继承将在后面的章节讲解,现在我们只需要简单地从object类继承。
有了Person类的定义,就可以创建出具体的xiaoming、xiaohong等实例。创建实例使用 类名+(),类似函数调用的形式创建:
xiaoming = Person()
xiaohong = Person()
3. python中创建实例属性
任务
请创建包含两个 Person 类的实例的 list,并给两个实例的 name 赋值,然后按照 name 进行排序。
1 #python 2.7 2 class Person(object): 3 pass 4 5 p1 =Person() 6 p1.name ='Bart' 7 p2 =Person() 8 p2.name ='Adam' 9 p3 =Person() 10 p3.name ='Lisa' 11 L1 =[p1, p2, p3] 12 L2 = sorted(L1,key=lambda x: x.name) 13 print L2[0].name 14 print L2[1].name 15 print L2[2].name
输出
Adam
Bart
Lisa
4.python中初始化实例属性
任务
请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
1 #python2.7 2 class Person(object): 3 def __init__(self,name,gender,birth,**kw): 4 self.name = name 5 self.gender = gender 6 for k,w in kw.items(): 7 setattr(self,k,w) 8 9 xiaoming =Person('xiao ming','Male','1990-1-1', job='Student') 10 print xiaoming.name 11 print xiaoming.job
输出
xiao ming
Student
5. python中访问限制
任务
请给Person类的__init__方法中添加name和score参数,并把score绑定到__score属性上,看看外部是否能访问到。
1 #python2.7 2 class Person(object): 3 def __init__(self, name, score): 4 self.name = name 5 self.__score = score 6 def __str__(self): 7 return str(self.__score) 8 9 p =Person('Bob',59) 10 print p.name 11 print p 12 print p.__score
输出
Bob
59
Traceback (most recent call last):
File "test.py", line 12, in <module>
print p.__score
AttributeError: 'Person' object has no attribute '__score'
6. python中创建类属性
任务
请给 Person 类添加一个类属性 count,每创建一个实例,count 属性就加 1,这样就可以统计出一共创建了多少个 Person 的实例。
1 #python 2.7 2 class Person(object): 3 count =0 4 def __init__(self,name): 5 self.name = name 6 7 p1 =Person('Bob') 8 Person.count +=1 9 print Person.count 10 p2 =Person('Alice') 11 Person.count +=1 12 print Person.count 13 p3 =Person('Tim') 14 Person.count +=1 15 print Person.count
输出
1
2
3
7. python中类属性和实例属性名字冲突怎么办
任务
请把上节的 Person 类属性 count 改为 __count,再试试能否从实例和类访问该属性。
1 class Person(object): 2 __count =0 3 def __init__(self, name): 4 Person.__count +=1 5 self.name = name 6 7 p1 =Person('Bob') 8 p2 =Person('Alice') 9 print Person.__count
输出
Traceback (most recent call last):
File "test.py", line 9, in <module>
print Person.__count
AttributeError: type object 'Person' has no attribute '__count'
8. python中定义实例方法
任务
请给 Person 类增加一个私有属性 __score,表示分数,再增加一个实例方法 get_grade(),能根据 __score 的值分别返回 A-优秀, B-及格, C-不及格三档。
1 #python 2.7 2 class Person(object): 3 def __init__(self, name, score): 4 self.name = name 5 self.__score = score 6 def get_grade(self): 7 if self.__score >=85: 8 return'A' 9 elif self.__score >=60: 10 return'B' 11 else: 12 return'C' 13 14 p1 =Person('Bob',90) 15 p2 =Person('Alice',65) 16 p3 =Person('Tim',48) 17 print p1.get_grade() 18 print p2.get_grade() 19 print p3.get_grade()
输出
A
B
C
9. python中方法也是属性
任务
由于属性可以是普通的值对象,如 str,int 等,也可以是方法,还可以是函数,大家看看下面代码的运行结果,请想一想 p1.get_grade 为什么是函数而不是方法:
class Person(object): def __init__(self, name, score): self.name = name self.score = score self.get_grade = lambda: 'A' p1 = Person('Bob', 90) print p1.get_grade print p1.get_grade()
结果
<function <lambda> at 0x029F9AF0> A
4.10 python中定义类方法
任务
如果将类属性 count 改为私有属性__count,则外部无法读取__score,但可以通过一个类方法获取,请编写类方法获得__count值。
1 #python 2.7 2 class Person(object): 3 __count =0 4 @classmethod 5 def how_many(cls): 6 return cls.__count 7 def __init__(self,name): 8 self.name = name 9 Person.__count +=1 10 11 print Person.how_many() 12 p1 =Person('Bob') 13 print Person.how_many()
输出
0
1