极品召唤兽 发表于 2020-8-16 22:29:15

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

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



类与实例

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

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

https://s1.ax1x.com/2020/08/12/axc9C4.jpg

类的创建

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

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

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

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

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

https://s1.ax1x.com/2020/08/12/axWneI.jpg

类的 属性 的创建和变量的定义是一样的,类的 方法 的创建和函数的定义也很类似。唯一不同的是:类的 方法 中有个必须放在首位的参数 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()
# 输出:说着各式各样的语言

https://s1.ax1x.com/2020/08/12/axf3Ax.jpg

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

https://s1.ax1x.com/2020/08/12/axfdud.jpg

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条腿

https://s1.ax1x.com/2020/08/13/azz8zQ.jpg


static/image/hrline/1.gif


在 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__() 方法来描述一个类。


static/image/hrline/2.gif

面向对象与面向过程


面向过程

# 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()





始不垂翅 发表于 2020-8-17 06:41:49

大佬,这里例子是不是应该导入random模块呐?{:10_257:}

hornwong 发表于 2020-8-17 10:39:23

{:5_95:}

极品召唤兽 发表于 2020-8-17 20:59:28

始不垂翅 发表于 2020-8-17 06:41
大佬,这里例子是不是应该导入random模块呐?

欧了 已经加上了

dotaless 发表于 2020-8-18 22:00:31

学习了

dotaless 发表于 2020-8-18 22:06:04

加油

极品召唤兽 发表于 2020-8-18 22:07:38

dotaless 发表于 2020-8-18 22:06
加油

hhh可以自己再抄录一些总结一下QWQ

dan维 发表于 2020-8-20 18:27:41

{:5_106:}

dan维 发表于 2020-8-20 18:31:16

加油学习吧,因为运气不行{:7_131:}
页: [1]
查看完整版本: Python学习笔记21-----类与面向对象编程 New!