鱼C论坛

 找回密码
 立即注册
查看: 2479|回复: 8

[学习笔记] Python学习笔记21-----类与面向对象编程 New!

[复制链接]
发表于 2020-8-16 22:29:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 极品召唤兽 于 2020-8-17 21:21 编辑



类与实例

编程与生活是相通的,我们生活中把事物按 类 划分,比如人类、狗类、动物类、植物类等。在编程世界里,同样也分了很多 类,比如字符串、整数、浮点数等,我们用 type() 函数验证一下。

在 Python 中 类 是无数个相似个体的集合,其中的每个个体叫做 实例。


                               
登录/注册后可看大图


类的创建

我们以人类来举例,人类都有哪些共同点呢?两条胳膊、两条腿、直立行走、有着各种颜色的头发、说着各式各样的语言等。这些共同点分为两类:

特征:两条胳膊、两条腿、有着各种颜色的头发
行为:直立行走、说着各式各样的语言
在 Python 的类中,我们把这种特征和行为分别称为 属性(attribute)和 方法(method)。现实生活中的“类”是我们归纳总结出来的,而 Python 中的类需要我们自行创建。接下来我们看看如何创建一个类。

class Human:
  arms = 2
  legs = 2
  hair = '各种颜色的头发'

  def walk(self):
    print('直立行走')

  def speak(self):
    print('说着各式各样的语言')



                               
登录/注册后可看大图


类的 属性 的创建和变量的定义是一样的,类的 方法 的创建和函数的定义也很类似。唯一不同的是:类的 方法 中有个必须放在首位的参数 self,它表示创建的实例本身。至于为什么需要这个 self,我们后面细说。


类的调用

class Human:
  arms = 2
  legs = 2
  hair = '各种颜色的头发'

  def walk(self):
    print('直立行走')

  def speak(self):
    print('说着各式各样的语言')

# 类的实例化
human = Human()

print(human.arms)
# 输出:2

print(human.legs)
# 输出:2

print(human.hair)
# 输出:各种颜色的头发

human.walk()
# 输出:直立行走

human.speak()
# 输出:说着各式各样的语言


                               
登录/注册后可看大图


我们实例化后得到实例 human 后,实例 human 就拥有了 Human 类的所有 属性 和 方法。然后我们通过 实例名.属性名 和 实例名.方法名 去调用它们。


                               
登录/注册后可看大图


class Human:
  arms = 2
  legs = 2
  hair = '各种颜色的头发'

  def walk(self):
    print('直立行走')

  def speak(self):
    print('说着各式各样的语言')

  def intro(self):
    # 类的方法里访问类的变量
    print('人类有%d条胳膊%d条腿' % (self.arms, self.legs))

# 类的实例化
human = Human()

human.intro()
# 输出:人类有2条胳膊2条腿


                               
登录/注册后可看大图




                               
登录/注册后可看大图



在 Python 的类中,有一种特殊的方法——初始化方法。它的格式是 def __init__(self):,方法名由 init(initialize 的缩写,初始化的意思)加左右两边的 双下划线 组成。



注意:初始化方法的 init 前后各有 两个 下划线,是 __init__ 而不是 _init_。


初始化方法的特殊之处是:每当进行类的实例化时,初始化方法会自动被执行。我们看个例子:
class Human:
  def __init__(self):
    print('Hi,我是 Human 类的初始化方法')

human = Human()
# 输出:Hi,我是 Human 类的初始化方法

我们通常会在 初始化方法 里完成类属性初始值的设置
class Human:
  def __init__(self):
    # self.不能丢
    self.arms = 2
    self.legs = 2
    self.hair = '各种颜色的头发'

  def walk(self):
    print('直立行走')

  def speak(self):
    print('说着各式各样的语言')

human = Human()
print(human.hair)
# 输出:各种颜色的头发

除了进行固定的初始值设置,初始化方法 可以接收其他参数,进行自定义的属性初始值设置。我们再看个例子

class Human:
  def __init__(self, name, arms, legs, hair):
    # self.不能丢
    self.name = name
    self.arms = arms
    self.legs = legs
    self.hair = hair

  def walk(self):
    print('直立行走')

  def speak(self):
    print('说着各式各样的语言')

  def intro(self):
    print('我叫{},我有{}'.format(self.name, self.hair))

xiaobei = Human('小贝', 2, 2, '粉红色的头发')
print(xiaobei.name)
# 输出:小贝

xiaobei.intro()
# 输出:我叫小贝,我有粉红色的头发

实例演练

class Human:
  # 在这里补充初始化方法
  def __init__(self,name,heads,arms):
    self.name = name
    self.heads  = heads
    self.arms = arms
  
  def intro(self):
    print('我叫{},我有{}头{}臂'.format(self.name, self.heads, self.arms))

nezha = Human('哪吒',3,6)
nezha.intro()


可以看到,有了 __str__() 方法,直接打印实例的结果为 __str__() 方法的返回值。因此,我们可以使用 __str__() 方法来描述一个类。



                               
登录/注册后可看大图


面向对象与面向过程


面向过程
# 1.用字典存储姓名和分数
student1 = {'name': '小贝', 'score': 98}
student2 = {'name': '闻闻', 'score': 93}

# 2.定义打印分数的函数
def print_score(student):
  print('姓名:%s,分数:%d' % (student['name'], student['score']))

# 3.调用打印分数的函数
print_score(student1)
print_score(student2)
面向对象
# 1.定义学生类
class Student:
  def __init__(self, name, score):
    self.name = name
    self.score = score

  def print_score(self):
      print('姓名:%s,分数:%d' % (self.name, self.score))

# 2.实例化学生类
student1 = Student('小贝', 98)
student2 = Student('闻闻', 93)

# 3.调用实例的方法
student1.print_score()
student2.print_score()

例子

from random import randint

class Lottery:
  def __init__(self, times):
# 号码个数
    self.times = times
# 中奖号码池
    self.lottery = []

  def draw_lottery(self):
    for i in range(0, self.times):
      number = randint(0, 99)
      self.lottery.append(number)

  def print_lottery(self):
    print('本期彩票中奖号码为:%s' % self.lottery)
# 实例化,抽 6 个号码
lottery = Lottery(6)
# 抽奖
lottery.draw_lottery()
# 开奖
lottery.print_lottery()





评分

参与人数 2荣誉 +5 鱼币 +3 收起 理由
小鲨鱼666 + 5
nizitao + 3

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-17 06:41:49 | 显示全部楼层

回帖奖励 +1 鱼币

大佬,这里例子是不是应该导入random模块呐?

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
极品召唤兽 + 1 + 1 是的哦!谢谢提醒~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 10:39:23 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-17 20:59:28 | 显示全部楼层
始不垂翅 发表于 2020-8-17 06:41
大佬,这里例子是不是应该导入random模块呐?

欧了 已经加上了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-18 22:00:31 | 显示全部楼层

回帖奖励 +1 鱼币

学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-18 22:06:04 | 显示全部楼层
加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-18 22:07:38 | 显示全部楼层

hhh可以自己再抄录一些  总结一下QWQ
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-20 18:27:41 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-20 18:31:16 | 显示全部楼层
加油学习吧,因为运气不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表