4.python面向对象编程基础
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.python面向对象编程基础相关的知识,希望对你有一定的参考价值。
4.1 面向对象编程的基本思想在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类如下:
class Person(object):
pass
按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。类的继承将在后面的章节讲解,现在我们只需要简单地从object类继承。
有了Person类的定义,就可以创建出具体的xiaoming、xiaohong等实例。创建实例使用 类名+(),类似函数调用的形式创建:
xiaoming = Person()
xiaohong = Person()
任务
请创建包含两个 Person 类的实例的 list,并给两个实例的 name 赋值,然后按照 name 进行排序。
- #python 2.7
- class Person(object):
- pass
- p1 = Person()
- p1.name = ‘Bart‘
- p2 = Person()
- p2.name = ‘Adam‘
- p3 = Person()
- p3.name = ‘Lisa‘
- L1 = [p1, p2, p3]
- L2 = sorted(L1,key=lambda x: x.name)
- print L2[0].name
- print L2[1].name
- print L2[2].name
任务
请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
- #python2.7
- class Person(object):
- def __init__(self,name,gender,birth, **kw):
- self.name = name
- self.gender = gender
- for k,w in kw.items():
- setattr(self,k,w)
- xiaoming = Person(‘xiao ming‘, ‘Male‘, ‘1990-1-1‘, job=‘Student‘)
- print xiaoming.name
- print xiaoming.job
任务
请给Person类的__init__方法中添加name和score参数,并把score绑定到__score属性上,看看外部是否能访问到。
- #python2.7
- class Person(object):
- def __init__(self, name, score):
- self.name = name
- self.__score = score
- def __str__(self):
- return str(self.__score)
- p = Person(‘Bob‘, 59)
- print p.name
- #print p.__score
- print p
任务
请给 Person 类添加一个类属性 count,每创建一个实例,count 属性就加 1,这样就可以统计出一共创建了多少个 Person 的实例。
- #python 2.7
- class Person(object):
- count = 0
- def __init__(self,name):
- self.name = name
- p1 = Person(‘Bob‘)
- Person.count += 1
- print Person.count
- p2 = Person(‘Alice‘)
- Person.count += 1
- print Person.count
- p3 = Person(‘Tim‘)
- Person.count += 1
- print Person.count
任务
请把上节的 Person 类属性 count 改为 __count,再试试能否从实例和类访问该属性。
- class Person(object):
- __count = 0
- def __init__(self, name):
- Person.__count += 1
- self.name = name
- p1 = Person(‘Bob‘)
- p2 = Person(‘Alice‘)
- #print Person.__count
任务
请给 Person 类增加一个私有属性 __score,表示分数,再增加一个实例方法 get_grade(),能根据 __score 的值分别返回 A-优秀, B-及格, C-不及格三档。
- #python 2.7
- class Person(object):
- def __init__(self, name, score):
- self.name = name
- self.__score = score
- def get_grade(self):
- if self.__score >= 85:
- return ‘A‘
- elif self.__score >=60:
- return ‘B‘
- else:
- return ‘C‘
- p1 = Person(‘Bob‘, 90)
- p2 = Person(‘Alice‘, 65)
- p3 = Person(‘Tim‘, 48)
- print p1.get_grade()
- print p2.get_grade()
- print p3.get_grade()
任务
由于属性可以是普通的值对象,如 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值。
#python 2.7
class Person(object):
__count = 0
@classmethod
def how_many(cls):
return cls.__count
def __init__(self,name):
self.name = name
Person.__count += 1
print Person.how_many()
p1 = Person(‘Bob‘)
print Person.how_many()
以上是关于4.python面向对象编程基础的主要内容,如果未能解决你的问题,请参考以下文章