zoukankan      html  css  js  c++  java
  • 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}



  • 相关阅读:
    JavaSE_11_File类、递归
    JavaSE_10_IO流
    leyou_07_对数据的操作
    JavaSE_09_Map
    JavaSE_08_Collections常用功能
    java 22
    java 22
    java 22
    java 22
    java 22
  • 原文地址:https://www.cnblogs.com/johnsonbug/p/12706976.html
Copyright © 2011-2022 走看看