当前位置:
文档之家› Python语言面向对象编程
Python语言面向对象编程
4. __int__()方法中有三条赋值语句,定义了三个变量name、 gender和weight,这三个变量都有前缀self。以self 为前缀的 变量都可供类中的所有方法使用,我们还可以通过类的任何实例 来访问这些变量。='张三'将变量name赋值为“韩信”, 然后该变量被关联到当前创建的实例。self.gender='男'和 self.weight=70的作用与此类似。像这样带有前缀self的、可 通过实例访问的变量称为属性。
8
l 该代码重新定义了Person类,与上一节中定义的Person 类不同的点如下:
1. __init__()方法拥有除self外的三个参数:name、gender、 weight,分别赋值给、self.gener、self.weight。 在创建Person对象的时候可以通过传不同的值创建不同的对象, 如在代码块4中,通过p1=Person('韩信','男',70),创建一个 名为韩信,男性,体重70的Person对象,通过p2=Person('王 昭君','女',50)创建一个名为王昭君,女性,体重50的Person对 象。
def say(self): print('My name is %s' % (self._name))
def __setWeight(self, weight): self.__weight=weight
14
l 以上代码定义了两个私有属性_name和 __weight,一个私有方法__setWeight(),“_” 和“__”的不同之处在于:
15
类属性
# 例 8‑ 6类属性的使用示例 #代码块7:类的定义 class Person:
cHale Waihona Puke unt=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)
2. 这个类中只有一个函数,类中的函数也称为“方法”,该方 法的名称为__init__,前面学到的有关函数的一切都适用 于方法,唯一重要的差别是调用方法的方式。__init__() 不是普通方法,是一个特殊的方法,其作用是:每当你根 据Person 类创建新实例时,Python都会自动运行它。在 这个方法的名称中,开头和末尾各有两个下划线,这是一 种约定,旨在与普通方法进行区分。
1. 单下划线“_”开头:只是告诉别人这是私有属性,外 部依然可以访问更改,所以p4._name可以正常访问;
2. 双下划线“__”开头:比如__weight属性不可通过 p4.__weight来访问或者更改, p4.__setWeight(80)不可以调用,但是可以在类内 部的方法调用,比如eat()方法调用了__setWeight ()方法,run()方法修改了__weight属性。
self._name=name self.gender =gender self.weight=weight print('A person named %s is created' % self._name)
11
对象属性的修改
# 例 8‑ 4属性值的添加、修改与删除示例 p1=Person('安琪拉','女',45) p1.height=170 p1.weight=46 print(p1.height, p1.weight) del p1.height print(p1.height, p1.weight)
第8章 面向对象编程
学习目标
l 掌握定义类的方法 l 掌握创建和使用对象的方法 l 掌握类的继承的概念和使用方法
2
8.1 类和对象
l 面向对象编程是模拟人类认识事物的方式的编程方法,是 最有效的编程方法之一。人类通过将事物进行分类来认识 世界,比如,人类将自然界中的事物分类生物和非生物, 又将生物分为动物、植物、微生物,又将动物分为有脊椎 动物和无脊椎动物,继而又分为哺乳类、鸟类、鱼类、爬 行类等,哺乳类又分为猫、狗、牛、羊等。每一个类的个 体都具有一些共同的属性,在面向对象编程中,个体被称 为对象,又称为实例。在本章的学习中,类、对象、实例 是三个常用的术语。
def eat(self,food): self.__setWeight(self.__weight+food) print('%s eat %s food, and my weight is %d' % (self._name,food, self.__weight))
def run(self): self.__weight=self.__weight-1 print('%s runned, and my weight is %d' % (self._name,self.__weight))
12
l 其中:
1. p1.height=70为对象p1添加了一个名为 height的属性并赋值为70,height属性在 Person类中没有定义,只在p1对象中存在。
2. p1.weight=46将对象p1的weight属性的值 修改为46。
3. del p1.height删除对象p1的height属性。
3
Person类的定义和实例化
l 接下来我们来定义人的类Person类,人有名字(name)、 性别(gender)、体重(weight)等属性,根据这个说 明,我们可以定义Person类并创建Person对象,如以下 代码所示:
#代码块1:类的定义 class Person:
def __init__(self): ='韩信' self.gender='男' self.weight=70 print('An instance
17
一个简单的继承例子
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' % ())
6
l 代码块2紧接在类Person的定义语句后面,是使用 类Person创建对象的代码,创建了两个名为p1和 p2的Person对象,也称为Person实例。代码块2 的解释如下:
1. 使用Person()创建一个对象,并赋值给p1对象变量, p1是这个对象的对象名,在创建对象时自动调用 Person类的__init__()方法。
9
3. 定义了run()方法,该方法只有一个参数self,通过 self.weight=self.weight-1使得调用run()的对象 体重减1,如p1.run(),表示Person对象p1通过跑 步锻炼体重降低了1,同时显示信息。
4. 定义了say()方法,该方法只有一个参数self,通过 print('My name is %s' % ())语句自我 介绍,如p2.say(),输出“王昭君”,自我介绍。
2. 使用“.”号访问p1的属性,包括name、gender、 weight,“.”符号是访问对象的属性和方法的特殊符号。
7
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' % ())
13
私有属性和私有方法
# 例 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)
18
l 关于以上代码的说明如下:
1. 定义了三个类:Person类、Teacher类、Student类。 其中,Person类是基类,Teacher和Student继承了 Person类,是其派生类,派生的语法分别是class Teacher(Person)和class Student(Person)。
16
8.2. 类的继承
l 面向对象的编程带来的主要好处之一是代 码的重用,实现这种重用的方法之一是通 过继承机制。一个类继承另一个类时,它 将自动获得另一个类的所有属性和方法; 原有的类称为父类,而新类称为子类。子 类继承了其父类的所有属性和方法,同时 还可以定义自己的属性和方法。继承完全 可以理解成类之间的类型和子类型关系。