Python3.x基础学习-类--封装

时间:2020-04-15
本文章向大家介绍Python3.x基础学习-类--封装,主要包括Python3.x基础学习-类--封装使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

封装特性

1 什么是封装:
总结: 隐藏对象的属性和方法实现细节,仅仅对外提供公共访问方式
目的:保护隐私
格式:__属性名=属性值
case1:
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return "我叫{0},今年{1}岁".format(self.name,self.age)

per = Person("johnson","25")
print(per)

print(per.name,per.age)
per.age=-20
print(per)

# 我叫johnson,今年25岁
# johnson 25
# 我叫johnson,今年-20岁

case2

class Person:
    def set_name(self,name):
        self.name = name

    def get_name(self):
        return self.name

    def set_age(self,age):
        if 0<age<100:
            self.age=age
        else:
            print('年龄不符合要求!')
            self.age=0
    def get_age(self):
        return self.age

    def __str__(self):
        return "我叫{0},今年{1}岁".format(self.name,self.age)


per = Person()
per.set_name('Johnson')
print(per.get_name())
per.set_age(25)
print(per.get_age())
per.age=-10
print(per)

# Johnson
# 25
# 我叫Johnson,今年-10岁

case3

class Person:
    def set_name(self,name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_age(self,age):
        if 0<age<100:
            self.__age=age
        else:
            print('年龄不符合要求!')
            self.__age=0
    def get_age(self):
        return self.__age

    def __str__(self):
        return "我叫{0},今年{1}岁".format(self.__name,self.__age)

per = Person()
per.set_name('Johnson')
print(per.get_name())
per.set_age(25)
print(per.get_age())
per.__age=-10
print(per)
print(per.__age)

# Johnson
# 25
# 我叫Johnson,今年25岁
# -10
私有方法:在方法前添加__例如:__send_message()
私有方法作用:就是在开发的过程中保护核心代码
在类的外部不能使用(对象不能调用私有方法)
class A:
    def __test(self):
        print("--私有方法--")

    def test2(self):
        print('普通方法')

a = A()
# a.__test()  #不能调用
a.test2()

# 普通方法
class Dog:
    def __init__(self):
        self.__baby_count=0

    def birth(self):
        print('生了一个崽')
        self.__baby_count+=1
        self.__holiday()
    def __holiday(self):
        print("休息了一个月产假")

    def __str__(self):
        return "孩子数量是{}".format(self.__baby_count)


dog = Dog()

dog.birth()
print(dog)
dog.baby_count=3
print(dog)

# 生了一个崽
# 休息了一个月产假
# 孩子数量是1
# 孩子数量是1
class Phone:
    def __phone(self):
        print("正在打电话")

    def platmoney(self,money):
        if money>0:
            self.__phone()
        else:
            print("欠费了,兄弟")

phone = Phone()
phone.platmoney(1)

# 正在打电话
私有化封装后的限制
1.类中可以访问
2.类外/对象外不可以访问
3.子类/子类对象 不可以访问

注意事项
1.在python中实现的封装操作,不是通过权限控制而是通过改名(name mangling 改名策略)实现的,名字变了找不到而已
2.可以使用 __dict__可以查看属性(包括私有属性)的值,在类的内部使用的私有属性,python内部会自动进行转换成_类名__属性名。
在类的外部不能给对象添加私有属性,因为不能转换成_类名__属性名类型
class Person1:
    def set_name(self,name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_age(self,age):
        if 0<age<100:
            self.__age=age
        else:
            print('年龄不符合要求!')
            self.__age=0
    def get_age(self):
        return self.__age

    def __str__(self):
        return "我叫{0},今年{1}岁".format(self.__name,self.__age)

per  = Person1()
per.set_name("Mary")
per.set_age(25)
print(per)
print(per.__dict__)
per.__age = -10
print(per)
print(per.__age)
print(per.__dict__)
我叫Mary,今年25岁
# {'_Person1__name': 'Mary', '_Person1__age': 25}
# 我叫Mary,今年25岁
# -10
# {'_Person1__name': 'Mary', '_Person1__age': 25, '__age': -10}

修改私有属性
per._Person1__age = -10
print(per)
print(per.__dict__)

{'_Person1__name': 'Mary', '_Person1__age': 25, '__age': -10}
我叫Mary,今年-10岁
{'_Person1__name': 'Mary', '_Person1__age': -10, '__age': -10}



原文地址:https://www.cnblogs.com/johnsonbug/p/12706976.html