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}



  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/johnsonbug/p/12706976.html
Copyright © 2011-2022 走看看