以下是我对Python3面向对象------封装的理解,因为博主也是初学Python3,有很多东西都还停留在表层的理解,如果我的博客有任何错误,请及时评论或者私信我,我会及时更改。也欢迎同样学习Python的你愿意关注我的博客,我会把我每周的学习内容进行整理和上传,方便大家沟通和交流学习经验。
Python面向对象---------封装
(1)面向对象:封装 继承 多态
什么是面向对象?什么是面向过程?两者有什么区别?
面向对象:注重的是设计,从设计的角度,从生活的角度设计代码,追求的是代码的扩展性和维护性
面向过程:注重的是结果,以结果的角度出发考虑问题,不关心中间的实现过程,
不管用什么方法得到结果即可
(2)封装
什么是封装?
比函数大一点的容器叫做类(class),类这个容器中可以放很多函数和变量,
把同一类的函数和变量放到一个类中去的过程叫做封装。
类:比较抽象化,可以比作一张图纸或者一个模板,看不见
对象:是根据类(图纸)创建出的具体的物体
先有类,后有对象
一个类可以创建无数个对象
对象与对象之间属相不一定一致。
类是描述一类事物的,事物由属性和行为构成
属性:这类事物的信息(姓名,年龄,颜色,身高等) 用变量表示
行为:会做的的事 用函数表示
所以说类也可以说是由函数和变量组成的
当类中没有变量时,通过对象名,Python是可以自动创建出变量,
但是这个变量只能自己用。(不推荐这种方式)
怎么写一个类和类中的构造函数?
1.创建变量
2.初始化赋值
class Person:
# 写构造函数 init(初始化)
# self.变量名----创建变量
# self--自己(谁调用self就代表谁)
# Person()---构造函数
def __init__(self):
self.name = None
self.age = None
self.sex = None
print('我出生了!')
#普通函数
def eat(self):
name = '李四'
print(name,'吃饭')
#创建对象(实例化对象)
#创建对象默认调用构造函数
p1 = Person()
p1.name = '张三'
p1.age = 22
p1.sex = '男'
print(p1.name,p1.sex,p1.age)
p1.eat()
下边看一个案例:
案例要求:有一个牌库,发牌后左右手各13张牌,实现左右手换牌。(初学简单实现即可)
案例分析:类:人 牌 手
人:属性:左手,右手 行为:换牌
牌:属性:花色,数字 行为:无
手:属性:左手的牌 右手的牌 行为:无
#因为发牌是随机的,所以先导入random函数,接着根据分析分别创建类
import random
#牌类
class Card:
def __init__(self):
self.card_number=None
self.card_color=None
#手类
class Hand:
def __init__(self):
self.card=None
#人类
class Person:
def __init__(self):
self.left_hand_card=None
self.right_hand_card=None
def changeCard(self):
c=self.left_hand_card
self.left_hand_card=self.right_hand_card
self.right_hand_card=c
#牌库(模拟随机发13张牌)
PK = Card()
PK.card_color = ['♡','♣','♤','♢']
PK.card_number = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
r,l = Hand(),Hand()
l.card,r.card = '',''
for i in range(13):
pai1 = random.choice(PK.card_color) + random.choice(PK.card_number) + ' '
pai2 = random.choice(PK.card_color) + random.choice(PK.card_number) + ' '
l.card += pai1
r.card += pai2
p=Person()
p.left_hand_card,p.right_hand_card = l,r
print('换前')
print('左手:{},右手:{}'.format(p.left_hand_card.card,p.right_hand_card.card))
p.changeCard()
print('换后')
print('左手:{},右手:{}'.format(p.left_hand_card.card,p.right_hand_card.card))
根据这个案例,我们应该大致了解了Python3中封装的基本含义和封装的方法,其中封装的关键字class创建类的时候后边不加括号,下边创建对象调用类时用需要写括号,封装的意思就是把一个功能打包在一起,从而让相同功能形成一个代码块,在后期的维护和扩展上会节省很多的时间,因为你只需把相应功能的代码块(类)进行修改而不像面向过程那样牵一发而动全身了。
补充知识:1.构造函数加参数
我们知道在将一个功能写成一个函数时,为了方便和节省代码,我们可以给函数定几个形参,利用参数传递的方式来减少代码量,那么构造函数能不能加参数呢? 当然是可以的,那么构造参数如何加参数呢?看下面的例子:
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
print('%s的年龄为:%d'%(name,age))
p=Person('张三',22)
运行结果证明'张三'和年龄完成了传递,所以,构造函数加参数的格式为:def __init__(self,形参)。实参写在下边对象调用类的括号里边,可以同时传递多个参数,注意构造参数内的self不可省略,其余形参一次往后边写,用逗号隔开。