Python 封装

52 阅读2分钟

封装

封装就是隐藏底层的实现细节,只提供公有的接口供外界访问, 这样当底层实现细节改变的时候,就不会对外界造成影响。

  • 将属性和方法写到类的里面的操作即为封装
  • 封装可以为属性和方法添加私有权限

私有属性

在类的设计角度,我们可以将属性或方法(类的成员)定义为私有,来实现封装。

私有成员只能在定义类的内部进行访问,在类外是无法进行访问的。

私有成员的定义方式:以_进行开头,但是不能以两个或多个进行结尾。

class Computer:
    def __init__(self,cpu):
        self.cpu = cpu
        # 私有属性(私有的实例属性)
        self.__memory = 1024
        # 在定义私有属性“类的内部”,可以访问私有成员
        #print(self.__memory)
c = Computer("某cpu")
c.__memory  # 可以发现私有属性不能够在外部直接访问

为什么非要定义为:私有属性呢?定义为一般的实例属性不是也可以吗? 原因在于:定义为私有属性后。当我们以后需要对类中某属性做出修改时,只需要在内部修改,而不会对外部的使用者,产生影响。

image.png

# # 封装
# class User(object):
#     def __init__(self,name,age):
#         self._name = name   # 受保护的变量
#         self.__age = age  # 私有变量
#
#     '''把函数当做变量去使用:
#     @property
#     def 变量名() #获取变量
#     @age.setter
#     def 变量名() #修改变量
#     '''
#
#     @property  # 获取变量
#     def age(self):
#         return self.__age
#
#     @age.setter   # 变量的修改器
#     def age(self,age):
#         if isinstance(age,int):
#             self.__age = age
#         else:
#             raise Exception('年龄只能是整数')
#
#     def show_infos(self):
#         print('大家好,我是%s,我今年%d' %(self._name,self.__age))
#
#
# mia = User('mia',24)
# # print(mia.get_age())
# # mia.set_age('二十五')
# # print(mia.get_age())
# '''
# print(mia.age)
# mia.age=25
# print(mia.age)
# '''
# print(mia.age)
# mia.age = '二十五'
# print(mia.age)



class Player(object): # 父类
    numbers = 0   # 类属性
    levels = ['青铜', '白银', '黄金', '钻石', '王者']
    def __init__(self,name,age,city,level):  # 初始化函数(构造函数)
        self._name = name  # 实例属性
        self._age = age
        self._city = city
        if level not in Player.levels:
            raise Exception('段位设置错误!')
        else:
            self.level = level
        Player.numbers += 1

    @property
    def city(self):
        return self._city

    @city.setter
    def city(self,city):
        if len(city)>10 or len(city)<2:
            raise Exception('城市名称有误,请检查!')
        self._city = city


    @property
    def age(self):
        return self._age

    @age.setter
    def age(self,age):
        if not isinstance(age,int):
            raise Exception('年龄必须是整数')
        if age<0 or age>100:
            raise Exception('年龄必须在0到100之间')
        self._age = age

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self,name):
        if name == self.name:
            raise Exception('修改的名字与现在的名字相同,请重新修改')
        else:
            self._name = name


    def show(self):  # 实例的方法
        print('我是荣耀王者的第%d个玩家,我的名字是%s,我来自 %s,我的段位是%s' % (Player.numbers,self.name,self.city,self.level))

    def level_up(self):
        index1 = Player.levels.index(self.level)
        if index1<len(Player.levels)-1:
            self.level = Player.levels[index1+1]

    def get_weapon(self,weapon):
        self.weapon = weapon

    def show_weapon(self):
        return self.weapon.show_weapon()

    @classmethod
    def get_players(cls):  # 类方法
        print('荣耀王者的用户数量已经达到了%d人'%cls.numbers)

    @staticmethod
    def isvalid(**kwargs):
        if kwargs['age']>18:
            return True
        else:
            return False

mia = Player('mia',26,'山东','王者')
mia.name = 'tom'
print(mia.name)
mia.age = 22
print(mia.age)
mia.city = '苏州'
print(mia.city)
print(mia.__dict__)