简介
虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。
类是对现实世界中一些事物的封装。在人类认知中,会根据属性相近
把东西归类,并且给类别命名。比如说,鸟类的共同属性是有羽毛,通过产卵生育后代。而且,这些鸟还有共同的行为,如飞行、名叫。任何
一只特别的鸟都在
鸟类的原型基础上的。接下来以鸟为例来介绍类的用法。
class Bird: #创建类--鸟
have_feather = True #定义类的属性(have_feather、way_of_reproduction、song均是该类的属性)
way_of_reproduction = "egg"
song="叽叽喳喳"
def sing(self): #定义类的方法(self必不可少)
print(self.song)
def move(self):
print("飞飞飞飞飞")
mybird=Bird() #实例化类的对象,可以使用这个对象访问类中的方法和属性
mybird.sing() #访问类中的方法(对象名.方法)
print("mybird通过"+mybird.way_of_reproduction+"繁殖") #访问类中的属性(+号的作用是连接字符串)
输出
小小的总结一下,我们定义了一个类(class),就是鸟(Bird)。在该类中,我们定义了三个变量,一个是有羽毛(have_feather),一个是生殖方式(way_of_reproduction),还有一个是叫声(叽叽喳喳),这几个变量就是类的属性(attribute)。我们还定义个两个函数,一个是鸣叫(sing(self)),另一个是移动(move(self)),这两个函数就是类的方法(method)。
类建好了之后,我将类实例化为一个叫mybird的对象,并利用这个对象对类的属性和方法进行访问。
子类
鸟可以继续细分为鸡、鸭、鹅.....这就是所谓的子类。
class Chicken(Bird): #继承上例中的Bird
song="喔喔喔喔喔!" #重写父类中的属性
def move(self): #重写父类中的方法
print("这种移动方式已经废弃",end="--->") #end的作用是把字符串末尾的换行符替换为“--->”
super().move() #调用父类中的方法(对象是没有super()的)
print("跑跑跑跑跑")
myChicken=Chicken()
myChicken.move()
myChicken.sing()
输出
这种移动方式已经废弃--->飞飞飞飞飞
跑跑跑跑跑
喔喔喔喔喔!
多重继承
class Calculator:
def calculate(self,expression):
self.value=eval(expression) #计算字符串中的表达式
class Talker:
def talk(self):
print("结果为",self.value)
class TalkCalculator(Calculator,Talker): #本类不做任何事情,但是同时继承两个子类,这种行为叫做多重继承
pass #pass是空语句,是为了保持程序结构的完整性。
myCal=TalkCalculator()
myCal.calculate("4+2")
myCal.talk()
小提示:
1.多态、封装与继承
多态:意味着可以对不同类的对象进行相同的操作。
封装:对外部世界隐藏类的细节。
继承:以普通的类为基础建立专门的类的对象。
2.面向对象概念
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重载:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重载。
实例变量:定义在方法中的变量,只作用于当前实例的类。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
3.子类如何调用父类中的方法
class B(A):
def method(self, arg):
# A.method(self,arg) #1直接写类名调用
# super(B, self).method(arg) #2用 super(type, obj).method(arg)方法调用
super().method(arg) #3在类定义中调用本类的父类方法,可以直接super().method(arg)
4.方法中的self
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是
self。
上一讲: Python菜鸟学习手册07----模块
下一讲: Python菜鸟学习手册09----面向对象续