当前位置:
文档之家› 第8章 PythonPytho程序设计基础教程-面向对象编程
第8章 PythonPytho程序设计基础教程-面向对象编程
19
关于以上代码的说明如下:
1. 定义了三个类:Person类、Teacher类、Student类 。其中,Person类是基类,Teacher和Student继承 了Person类,是其派生类,派生的语法分别是class T eacher(Person)和class Student(Person)。
4. __int__()方法中有三条赋值语句,定义了三个变量name、ge nder和weight,这三个变量都有前缀self。以self 为前缀的变 量都可供类中的所有方法使用,我们还可以通过类的任何实例来 访问这些变量。='张三'将变量name赋值为“韩信” ,然后该变量被关联到当前创建的实例。self.gender='男'和se lf.weight=70的作用与此类似。像这样带有前缀self的、可通 过实例访问的变量称为属性。
def say(self): print('My name is %s' % (self._name))
def __setWeight(self, weight): self.__weight=weight
15
以上代码定义了两个私有属性_name和__weig ht,一个私有方法__setWeight(),“_”和“ __”的不同之处在于:
14
私有属性和私有方法
# 例 8-5私有属性的使用示例 class Person:
def __init__(self,name,gender='男',weight=70): self._name=name self.gender=gender self.__weight=weight print('A person named %s is created' % self._name)
2. 定义了eat()方法,该方法的参数是self和food:self表示当前 调用eat()的对象,food是一个数字类型参数,表示吃进去的食 物重量,通过self.weight=self.weight+food使得调用eat() 方法的Person对象体重增加,如p1.eat(2)表示Person对象p1 的体重增加2,同时显示信息。
6
3. 在__init__()方法的定义中,形参self 必不可少,还必须位于 其他形参的前面。为何必须在方法定义中包含形参self 呢?因为 Python调用这个__init__() 方法来创建Dog 实例时,将自动 传入实参self ,每个与类相关联的方法调用都自动传递实参self ,让实例能够访问类中的属性和方法。我们创建Dog 实例时,P ython将调用Person 类的方法__init__() ,self 会自动传递, 因此我们不需要传递它。
17
8.2. 类的继承
面向对象的编程带来的主要好处之一是代 码的重用,实现这种重用的方法之一是通 过继承机制。一个类继承另一个类时,它 将自动获得另一个类的所有属性和方法; 原有的类称为父类,而新类称为子类。子 类继承了其父类的所有属性和方法,同时 还可以定义自己的属性和方法。继承完全 可以理解成类之间的类型和子类型关系。
p1=Person()
def __init__(self):
print()
='韩信'
print(p1.gender)
self.gender='男'
print(p1.weight)
self.weight=70
print('An instance
created')
5
代码块1定义了Person类,说明如下:
1. class是定义类的关键字,Person是类名,在Python定义 类的格式是“class 类名”,这是一个固定格式。
2. 这个类中只有一个函数,类中的函数也称为“方法”,该 方法的名称为__init__,前面学到的有关函数的一切都适 用于方法,唯一重要的差别是调用方法的方式。__init__( )不是普通方法,是一个特殊的方法,其作用是:每当你根 据Person 类创建新实例时,Python都会自动运行它。在 这个方法的名称中,开头和末尾各有两个下划线,这是一 种约定,旨在与普通方法进行区分。
16
类属性
# 例 8-6类属性的使用示例 #代码块7:类的定义 class Person:
count=0 def __init__(self,name,gender='男',weight=70):
self._name=name self.gender=gender self.__weight=weight Person.count=Person.count+1 print('A person named %s is created' % self._name)
self._name=name self.gender =gender self.weight=weight print('A person named %s is created' % self._name)
12
对象属性的修改
# 例 8-4属性值的添加、修改与删除示例 p1=Person('安琪拉','女',45) p1.height=170 p1.weight=46 print(p1.height, p1.weight) del p1.height print(p1.height, p1.weight)
4
Person类的定义和实例化
接下来我们来定义人的类Person类,人有名字(name )、性别(gender)、体重(weight)等属性,根据这 个说明,我们可以定义Person类并创建Person对象,如 以下代码所示:
#代码块1:类的定义
#代码块2:类的实例化
class Person:
Python语言程序设计
南京邮电大学计算机学院
2018.2
第8章 面向对象编程
学习目标
掌握定义类的方法 掌握创建和使用对象的方法 掌握类的继承的概念和使用方法
3
8.1 类和对象
面向对象编程是模拟人类认识事物的方式的编程方法,是 最有效的编程方法之一。人类通过将事物进行分类来认识 世界,比如,人类将自然界中的事物分类生物和非生物, 又将生物分为动物、植物、微生物,又将动物分为有脊椎 动物和无脊椎动物,继而又分为哺乳类、鸟类、鱼类、爬 行类等,哺乳类又分为猫、狗、牛、羊等。每一个类的个 体都具有一些共同的属性,在面向对象编程中,个体被称 为对象,又称为实例。在本章的学习中,类、对象、实例 是三个常用的术语。
class Teacher(Person): def teach(self, lesson): print("%s teachs %s" % (,lesson))
class Student(Person): def study(self, lesson): print("%s studies %s" % (,lesson))
7
代码块2紧接在类Person的定义语句后面,是使用 类Person创建对象的代码,创建了两个名为p1和p 2的Person对象,也称为Person实例。代码块2的 解释如下:
1. 使用Person()创建一个对象,并赋值给p1对象变量,p 1是这个对象的对象名,在创建对象时自动调用Person 类的__init__()方法。
5. 代码块4创建了两个不同的Person对象,分别是p1 和p2,分别调用他们的eat()、run()、say()方法。
11
对象属性的默认值设置
可以为属性在__init__()方法中设置默认值,代 码如下:
# 例 8 3在类的定义中加入初始化代码 def __init__(self, name, gender='男', weight=70):
18
一个简单的继承例子
class Person: def __init__(self,name,gender='男',weight=70): =name self.gender=gender self.weight=weight print('A person named %s is created' % ) def say(self): print('My name is %s' % ())
10
3. 定义了run()方法,该方法只有一个参数self,通过s elf.weight=self.weight-1使得调用run()的对象体 重减1,如p1.run(),表示Person对象p1通过跑步 锻炼体重降低了1,同时显示信息。
4. 定义了say()方法,该方法只有一个参数self,通过p rint('My name is %s' % ())语句自我 介绍,如p2.say(),输出“王昭君”,自我介绍。
13
其中:
1. p1.height=70为对象p1添加了一个名为hei ght的属性并赋值为70,height属性在Pers on类中没有定义,只在p1对象中存在。
2. p1.weight=46将对象p1的weight属性的 值修改为46。
3. del p1.height删除对象p1的height属性。
2. 使用“.”号访问p1的属性,包括name、gender、wei ght,“.”符号是访问对象的属性和方法的特殊符号。
8
Person类的完整定义
class Person: def __init__(self,name,gender,weight): =name self.gender=gender self.weight=weight print('A person named %s is created' % ) def eat(self,food): self.weight=self.weight+food print('%s eat %s food, and my weight is %d' % (,food, self.weight)) def run(self): self.weight=self.weight-1 print('%s runned, and my weight is %d' % (,self.weight)) def say(self): print('My name is %s' % ())