2020-07-22 Python学习笔记27类和面向对象编程

一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。

声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。

第27关 类与面向对象编程

练习:自己编写一个类

这一次我们不给任何提示,完全凭你自己写一个类。你可以思考一下生活中还有哪些“类”,有哪些特征和行为?然后用代码的方式写出来吧!

class Human:  #定义类的时候,类名称后面没有括号和参数

  arms = 2

  legs = 2

  eyes = 2

  ears = 2

  nose = 1

  hair = '各种颜色的头发'


  def speak(self):  #方法里面都是类的行为。

    print('会说话')


  def walk(self):

    print('会走路')


  def work(self):

    print('会做各种工作或者工具')


class Chinese(Human):

  pass

class Jiangsu(Chinese):

  hair = '黑色头发'


  def work(self):

    print('会走馒头和花卷')


  def speak(self):

print('会说汉语,普通话不太标准') 

#这几个我最初放在了实例化lijsh后面,导致错误,实例化之后,直接调用,不进行赋值

lijsh = Jiangsu()  #这里有个括号,但是没有英文冒号


print(lijsh.arms)

print(lijsh.legs)

print(lijsh.eyes)

print(lijsh.hair)

lijsh.work()

lijsh.speak()

lijsh.walk()

练习:第一武道会

五年一届的“天下第一武道会”又开始了!接下来登场的选手是卡卡罗特和比克大魔王,他们的初始血量都为 100,轮番攻击,每次攻击打出 10-20 点伤害,对方有 20% 的几率防御成功不受伤害。

Player 类的主体已经完成,还差一个 defend()(防御) 方法,请你根据要求补全它并补全轮番攻击的代码。

要求:

当受到伤害时,将当前血量(health)减去伤害值(damage),并打印出 xxx受到xx点伤害,血量剩余xx;

有 20% 的几率防御成功不受伤害,血量不变并打印出 xxx防御成功;

当受到伤害后,血量小于等于 0 时打印 xxx被击败;

使用循环使两人轮番攻击,当其中一人血量小于等于 0 时,结束循环。

from random import randint, random

class Player:

  def __init__(self, name):

    self.name = name

    self.health = 100


  def attack(self, target):

    print(self.name + '发起攻击')

    damage = randint(10, 20)

    target.defend(damage)


  def defend(self, damage):

    # 补全 defend() 方法

    if damage > 0:

      health = health - damage

      print('%s受到%d点伤害,血量剩余%d'%(self.name, ))

kakarotto = Player('卡卡罗特')

piccolo = Player('比克大魔王')

# 使用循环轮番攻击,当有人被击败后停止循环

kakarotto.attack(piccolo)

piccolo.attack(kakarotto)

我编写一半是在写不下去了,就放弃了,看了答案

根据答案写的代码:

from random import randint, random

class Player:

  def __init__(self, name):

    self.name = name

    self.health = 100


  def attack(self, target):

    print(self.name + '发起攻击')

    damage = randint(10, 20)

    target.defend(damage)


  def defend(self, damage):

    # 补全 defend() 方法

    if random() > 0.2:  #random()生成0-1不包括1的小数。

      self.health = self.health - damage

      print('%s受到%d点伤害,血量剩余%d'%(self.name, damage, self.health))

      if self.health <= 0:

        print(self.name + '被击败')

    else:

      print(self.name + '防御成功')

    print('----------------------')


kakarotto = Player('卡卡罗特')

piccolo = Player('比克大魔王')

# 使用循环轮番攻击,当有人被击败后停止循环

#kakarotto.attack(piccolo)

piccolo.attack(kakarotto)

kakarotto.attack(piccolo)

while True:

  if kakarotto.health > 0:

    kakarotto.attack(piccolo)

  else:

    break

  if piccolo.health > 0:

    piccolo.attack(kakarotto)

  else:

break

感觉程序越来越复杂,前后的逻辑关系,引用关系等,都越来难以把握了。比如这个程序,我能看懂程序,知道功能和作用,运行的逻辑等,但是自己写不出来。不知道最初写代码的人是不是都是我这样,还是我创新力差,年纪大反应慢。哎

练习:类的继承和调用

之前写过一个 Bird 类,这次我们再写一个继承自 Bird 类的 Lark(百灵鸟)类。Lark 类里只有一个空语句 pass,然后将 Lark 类实例化并调用 Bird 类中的 intro() 方法。

class Bird:

  wings = 2

  def fly(self):

    print('我会飞')

  def intro(self):

    print('我有%d只翅膀' % self.wings)

    self.fly()

class Lark(Bird):

  pass

lark = Lark()

lark.intro()

练习:类的多重继承

骡为马和驴杂交的产物,公驴和母马生的为马骡(Mule),公马和母驴生的为驴骡(Hinny)。

现在已经有了 Horse(马)类和 Donkey(驴)类,请你创建一个 Mule 类(马骡)和 Hinny(驴骡)类,分别继承自 Horse、Donkey 和 Donkey、Horse,然后对其进行实例化,试试调用其中的属性和方法。

# 马

class Horse:

  character = '性格温顺'

  def ride(self):

    print('我能作为骑乘')

# 驴

class Donkey:

  character = '性格暴躁'

  def work(self):

    print('我能拉磨')

# 马骡

class Mule(Horse, Donkey):

  pass

# 驴骡

class Hinny(Donkey, Horse):

  pass

mule = Mule()

hinny = Hinny()

print(mule.character)

mule.work()

mule.ride()

print(hinny.character)

hinny.ride()

hinny.work()

练习:类的定制

小贝最近拜了个武林高手为师,大师将武功秘籍 九阴真经 和武功 九阴白骨爪 都传授给了小贝。小贝刻苦练习将 九阴白骨爪 改进成了 九阴白骨爪改进版,并自学了武功秘籍 九阳神功 练成了 金刚不坏之躯。

模板代码中已经替你写好了 Master(师傅) 类,接下来请你补全 Apprentice(徒弟) 类使代码正常运行。

要求:

Apprentice 类继承 Master 类;

Apprentice 类中新增一个 book2 的属性,值为 九阳神功,新增一个 kungfu2() 的方法,功能是打印出 金刚不坏之躯;

Apprentice 类中重写 kungfu() 方法,改成打印出 九阴白骨爪改进版。

# 师傅

class Master:

  book = '九阴真经'

  def kungfu(self):

    print('九阴白骨爪')

# 补全徒弟的代码

class Apprentice(Master):

  #book = '九阴真经'

  book2 = '九阳神功'


  def kungfu(self):

    print('九阴白骨爪改进版')


  def kungfu2(self):

    print('金刚不坏之躯')

xiaobei = Apprentice()

print(xiaobei.book)

print(xiaobei.book2)

xiaobei.kungfu()

xiaobei.kungfu2()

学习笔记:

类的继承

通过 class 子类名(父类名) 的方式实现了类的继承,让子类拥有了父类的所有属性和方法。

class Chinese(Human):

  pass

提示:pass 是空语句,表示跳过,什么都不做。

类的多层继承

继承不只是子类继承父类的属性和方法,当父类还有自己的父类时,子类也能继承父类的父类的属性和方法。

class Chinese(Human):

  pass

class JiangSu(Chinese):

  pass

类的属性和方法会通过继承一直传递下去,减少了大量的重复代码,实现了代码的复用。

类的多重继承

除了继承一个类,我们还可以同时继承多个类,语法是 class 类 A(类 B, 类 C, 类 D):。

class ABC(Chinese, American):

  pass

class ABC(Chinese, American): 中 Chinese 靠前,调用实例的属性和方法时会优先在子类中查找,找不到再从最左侧的父类依次往右查找,直到找到为止,如果都没有找到则会报错。

类的定制

你可能会有疑问,既然子类继承父类的所有属性和方法,它俩是一样的,为什么不直接使用父类呢?因为类除了可以继承之外,还可以进行定制!我们可以在父类的基础上做以下两点定制:

新增:创建新的属性和方法

重写:修改继承自父类的属性和方法

新增 指在继承父类的属性和方法的基础上添加自己独有的属性或方法。比如:师傅传授给你一套武功,你自己又练了别的功法,这样你就既继承了师傅的功法,也独创了自己的功法。

重写 指在继承父类的属性和方法的基础上重写父类的属性和方法。比如:师傅传授给你一套武功,你对其进行了改进,同样的功法就变成你的独创功法。

需要注意的点:

定义类的方法时,第一个参数 self 不能丢,调用方法时要忽略;

self 作用是代替实例本身,在类中访问类的属性和方法;

初始化方法 __init__() 在类实例化时会自动执行,一般用于类属性的初始化;

子类可以继承父类的所有属性和方法,并且可以定制自己的属性和方法。


第27关
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352