Python3面向对象-----------封装

      以下是我对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不可省略,其余形参一次往后边写,用逗号隔开。       

猜你喜欢

转载自blog.csdn.net/weixin_42533541/article/details/81254835