【整理】python 面向对象三大特性之封装

封装

  • 封装定义:隐藏对象的部分属性和方法,仅对外提供公共的访问方式
  • 格式:__属性,__方法名
  • 特点:私有属性和私有方法只能在类的内部调用

下面是一个普通的封装类实例化:

class Person(object):
    def set_name(self, new_name):
        self.new_name = new_name

    def get_name(self):
        return self.new_name

    def set_age(self, new_age):
        if new_age < 0 or new_age > 130:
            print("这个不科学")
            self.new_age = 0
        else:
            self.new_age = new_age

    def get_age(self):
        return self.new_age

    def __str__(self):
        return ("姓名:%s\t年龄:%d" % (self.new_name, self.new_age))


person = Person()
person.set_name("张三") 
person.set_age(-1)
per_name = person.get_name()
per_age = person.get_age()
print(per_name, per_age)
print(person)

在这里插入图片描述

私有属性

  • 格式:__属性名 = 值

  • 特点:普通对象属性,类外面可以任意修改;私有属性,类外面不能使用,对象不能调用私有属性

class Person(object):
    def set_name(self, new_name):
        self.new_name = new_name

    def get_name(self):
        return self.new_name

    def set_age(self, new_age):
        if new_age < 0 or new_age > 130:
            print("这个不科学")
            self.new_age = 0
        else:
            self.new_age = new_age

    def get_age(self):
        return self.new_age

    def __str__(self):
        return ("姓名:%s\t年龄:%d" % (self.new_name, self.new_age))


person = Person()
person.set_name("张三")
person.set_age(-1)
per_name, per_age = person.get_name(), person.get_age()
print(per_name, per_age)
print(person)

person.new_age = 22
print(person)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190623024140813.png

但我们将对象属性私有化之后就可一解决这个问题了。

class Person(object):
    def set_name(self, new_name):
        self.new_name = new_name

    def get_name(self):
        return self.new_name

    def set_age(self, new_age):
        if new_age < 0 or new_age > 130:
            print("这个不科学")
            self.__new_age = 0
        else:
            self.__new_age = new_age

    def get_age(self):
        return self.__new_age

    def __str__(self):
        return ("姓名:%s\t年龄:%d" % (self.new_name, self.__new_age))


person = Person()
# 创建person对象,给私有属性赋值
person.set_name("张三")
person.set_age(-1)
per_name, per_age = person.get_name(), person.get_age()
print(per_name, per_age)
print(person)

# 想修改私有属性的值,但是会无效
person.__new_age = 22
print(person)

在这里插入图片描述

私有方法

  • 格式:__方法名
  • 作用:保护核心代码
  • 特点:对象不能调用私有方法,只能在类的内部调用
    例子:
class Call(object):
    def __init__(self, money):
        self.money = money

    def __call(self):
        if self.money > 0:
            return "正在呼叫。。。"
        else:
            return "您的电话已停机。。。"

    def call(self):
        return self.__call()

# 类实例化
phone = Call(-9)
#  call()内部调用__call方法
result = phone.call()
print(result)

#  尝试调用私有方法__call
result2 = phone.__call()
print(result2)

在这里插入图片描述

私有化封装的本质与限制

  1. 本质:在python中实现的封装操作,不是通过权限限制而是通过改名实现的,只是名字变了找不到了而已
  2. 查看对象属性:对象._dict_
  3. 私有属性、方法访问限制:
位置访问限制
类中可以访问
类/对象外不可以访问
子类/子类对象不可以访问

查看对象所有属性

对象._dict_

class Parent():
    def __init__(self,name,password,tpassword):
        self.name = name
        self.password = password
        self.__tpassword = tpassword
    def login(self):
        if self.__tpassword == self.password:
            return True
        else:
            return False

Parents = Parent("李自成","123456","123456")
print(Parents.__dict__)
print(Parents.login())

在这里插入图片描述

类外访问私有属性(可以但不允许这么操作)

对象._类名+私有属性


class Parent():
    def __init__(self, name, password, tpassword):
        self.name = name
        self.password = password
        self.__tpassword = tpassword

    def login(self):
        if self.__tpassword == self.password:
            return True
        else:
            return False


Parents = Parent("李自成", "123456", "123456")
print(Parents._Parent__tpassword)  # 访问私有属性

在这里插入图片描述

类外修改对象私有属性(可以但不允许这么操作)

class Parent():
    def __init__(self, name, password, tpassword):
        self.name = name
        self.password = password
        self.__tpassword = tpassword

    def login(self):
        if self.__tpassword == self.password:
            return True
        else:
            return False


Parents = Parent("李自成", "123456", "123456")
print(Parents.__dict__)
print(Parents.login())

Parents._Parent__tpassword = 90  #修改私有属性
Parents._Parent__tname = "李闯"  # 增加私有属性
print(Parents.__dict__)
print(Parents.login())

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值