继续更新Python教程-Python入门教程05面向对象编程

这一篇开始要回归Python的教程了,已经连续看了两天的韩剧了,要开始学习了。

这一篇是关于面对对象的知识,如果之前不熟悉的话,需要好好看一下,这个在之后应用的还是非常多的。

下面就开始教程吧。

Python面向对象编程

了解面向对象的编程

讲之前推荐一篇文章,面向对象圣经,可以把这一篇学完之后再回过去看一下,讲得还是很好的。

下面简单讲一下面向对象编程的思想。

以面向过程思想设计程序时,程序是一条条指令的顺序执行,当指令变得多起来时,它们被分隔成我们先前实验中讲解过的函数。而面向对象思想则是对象视为程序的组成单元,程序的执行通过调用对象提供的接口完成。

面向对象的四个核心概念:

·抽象

·封装

·继承

·多态

下面讲一下这四个概念在python中的应用。不完全按照这四个核心概念来讲。

抽象,封装

我们先看一个简单的类的例子

#创建类

classFoo(object):

def __init__(self,name):

self.name = name

def Bar(self):

print('Bar')

def Hello(self):

print('i am %s' %self.name)

#根据类Foo创建对象obj

obj =Foo('Dog')

obj.Bar()#执行Bar方法

obj.Hello()#执行Hello方法

>>'i am Dog'

print(dir(obj))

>> #这个可以看这个对象的方法

上面这个类中,object是Python中所有对象的祖先,它是所有类的基类。类需要一个初始化方法__init__是Python的初始化方法,注意前后各有两个下划线_,self指代当前的对象。所以在类的实例化的时候,需要Foo('Dog'),之后在类中就是要self来间接调用被封装的内容。

为了看出类有什么用处,我们来看一个练习:游戏人生程序

1、创建三个游戏人物,分别是:

苍井井,女,18,初始战斗力1000

东尼木木,男,20,初始战斗力1800

波多多,女,19,初始战斗力2500

2、游戏场景,分别:

草丛战斗,消耗200战斗力

自我修炼,增长100战斗力

多人游戏,消耗500战斗力

可以看到这个例子中需要创建一个类,初始化的时候需要名字,性别,年龄和战斗力。然后这个类里面有三个方法,分别是草丛战斗,自我修炼和多人游戏,可以参考下面的代码。

classpractice_02(object):

def__init__(self,name,gender,age,combat_effectiveness):

self.name = name

self.gender = gender

self.age = age

self.combat_effectiveness =combat_effectiveness

@property

def print_message(self):

print('%s,%s,%s,战斗力为%s'%(self.name,self.gender,self.age,self.combat_effectiveness))

def grass_battle(self):

self.combat_effectiveness = self.combat_effectiveness-200

def self_practice(self):

self.combat_effectiveness =self.combat_effectiveness+100

def multiplayer_game(self):

self.combat_effectiveness =self.combat_effectiveness-500

player =practice_02('仓井井','女','18',1000)

player.print_message

player.grass_battle()#参加一次草丛战斗

player.print_message

player.self_practice()#参加一次自我修炼

player.print_message

player.multiplayer_game()#参加一次多人游戏

player.print_message

继承

继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

例如:

·猫可以:喵喵叫、吃、喝、拉、撒

·狗可以:汪汪叫、吃、喝、拉、撒

如果我们要分别为猫和狗创建一个类,那么就需要为猫和狗实现他们所有的功能,如下所示:

class猫:

def喵喵叫(self):

print '喵喵叫'

def吃(self):

# do something

def喝(self):

# do something

def拉(self):

# do something

def撒(self):

# do something

class狗:

def汪汪叫(self):

print '喵喵叫'

def吃(self):

# do something

def喝(self):

# do something

def拉(self):

# do something

def撒(self):

# do something

上述代码不难看出,吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。所以有了继承的概念,我们从猫和狗身上提取共同的特点,来进行编写,如下所示:

classAnimal(object):

def eat(self):

print('%s吃' %self.name)

def drink(self):

print('%s喝' %self.name)

def shit(self):

print('%s拉' %self.name)

def pee(self):

print('%s撒' %self.name)

classCat(Animal):

def __init__(self,name):

self.name = name

def cry(self):

print('喵喵叫')

cat =Cat('小猫猫')

cat.eat()

cat.cry()

cat.pee()

所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

静态变量

静态变量是可以直接从类访问的,不需要实例化对象就可以访问。还是以上面动物的例子为例,假如说那些动物都来自动物园('zoo'),我们可以在Animal中加一个静态变量,一般声明在__init__前面。

classAnimal(object):

owner = 'zoo'

def eat(self):

print('%s吃' %self.name)

defdrink(self):

print('%s喝' %self.name)

def shit(self):

print('%s拉' %self.name)

def pee(self):

print('%s撒' %self.name)

classCat(Animal):

def __init__(self,name):

self.name = name

def cry(self):

print('喵喵叫')

cat =Cat('小猫猫')

print(cat.owner)

print(Animal.owner)#不需要实例化,可以直接访问

类方法

类方法和静态变量类似,它也可以通过类名直接访问,类方法用@classmethd装饰,类方法中可以访问类的静态变量。

classAnimal(object):

owner = 'zoo'

def owner_name(cls):

return cls.owner

def eat(self):

print('%s吃' %self.name)

def drink(self):

print('%s喝' %self.name)

def shit(self):

print('%s拉' %self.name)

def pee(self):

print('%s撒' %self.name)

classCat(Animal):

def __init__(self,name):

self.name = name

def cry(self):

print('喵喵叫')

cat =Cat('小猫猫')

print(cat.owner_name())

print(Animal.owner_name(Animal))

注意类方法的第一个参数传入的是类对象,而不是实例对象,所以是cls。

我们再来看一个例子

classFoo(object):

def __init__(self,name):

self.name = name

def ord_func(self):

#定义普通方法

print('普通方法')

@classmethod

def class_func(cls):

#定义类方法

print('类方法')

@staticmethod

def static_func():

#定义静态方法

print('静态方法')

f = Foo('江苏')

f.ord_func()

>> '普通方法'

#调用类方法

Foo.class_func()

>> '类方法'

#调用静态方法

Foo.static_func()

>> '静态方法'

property

在Python中,property可以将方法变成一个属性来使用,借助property可以实行Python风格的getter/setter,即可以通过property获得和修改对象的某一个属性。

我们就看下面的例子里理解吧。

classgoods(object):

def __init__(self):

#原价

self.original_price = 100

#折扣

self.discount = 0.8

@property

def price(self):

#实际价格=原价*折扣

new_price =self.original_price*self.discount

return new_price

@price.setter

def price(self,value):

self.original_price = value

@price.deleter

def price(self,value):

del self.original_price

obj =goods()

print(obj.price)#查看商品的价格

obj.price= 200 #设置商品的价格

print(obj.price)#查看现在商品的价格

#delobj.price删除商品价格

类的特殊成员__doc__

这里我们讲一个类的特殊成员,__doc__,这个是输出类的描述信息,什么意思呢,可以看下面的例子。

classdescribe(object):

"""可以显示类的说明信息

"""

def __init__(self,name):

self.name = name

def speak_name(self):

return self.name

des =describe('dog')

des.__doc__

>> '可以显示类的说明信息\n'

所以说我们可以使用__doc__来看一下类的说明的文档。

类的特殊成员还有__init__,__dict__(返回类对象中的所有成员)等等,详细的可以去看说明文档。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180318G19TAA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券