Python 面向对象 之 封装


面向对象三大特征:

  • 封装
  • 继承
  • 多态

定义类

class MyInfo(object):

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


if __name__ == '__main__':
    show_my_info = MyInfo("zhangwanqiang", 18, "男")
    print(show_my_info.name)
    print(show_my_info.age)
    print(show_my_info.gender)


运行结果:
zhangwanqiang
18

封装属性

1.1 属性的封装 一

class MyInfo(object):

    def __init__(self, name, age, gender):
        self.__name = name
        self.__age = age
        self.__gender = gender

    # 为封装的属性,使用getter提供公开的方法
    def get_name(self):
        return self.__name

    def get_age(self):
        return self.__age

    def get_gender(self):
        return self.__gender

    # 为封装的属性,使用setter修改属性的值
    def set_name(self, name):
        self.__name = name

    def set_age(self, age):
        self.__age = age

    def set_gender(self, gender):
        self.__gender = gender

    def __str__(self):
        return "【 name = " + self.__name + ", age = " + str(self.__age) + ", gender = " + self.__gender + "】"


if __name__ == '__main__':
    show_my_info = MyInfo("zhangwanqiang", 18, "男")

    # 调用私有化属性的get方法来访问属性
    print(show_my_info.get_name())
    print(show_my_info.get_age())
    print(show_my_info.get_gender())

    # 调用私有化属性的set方法来访问属性
    show_my_info.set_name("shuaigezhang")
    show_my_info.set_age(19)
    show_my_info.set_gender("男")

    print(show_my_info)


运行结果:
zhangwanqiang
18
男
【 name = shuaigezhang, age = 19, gender = 男】

1.2 属性的封装 二

property

class MyInfo(object):

    def __init__(self, name, age, gender):
        self.__name = name
        self.__age = age
        self.__gender = gender

    def get_name(self):
        return self.__name

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

    def get_age(self):
        return self.__age

    def set_age(self, age):
        self.__age = age

    def get_gender(self):
        return self.__gender

    def set_gender(self, gender):
        self.__gender = gender

    # 第二种写法(进一步的伪装封装代码)
    name = property(get_name, set_name)
    age = property(get_age, set_age)
    gender = property(get_gender, set_gender)


if __name__ == '__main__':
    show_my_info = MyInfo("zhangwanqiang", 18, "男")
    # print(show_my_info.get_name())
    # show_my_info.set_name("zhangmazi")
    # print(show_my_info.get_name())

    print(show_my_info.name)
    show_my_info.name = "z3"
    print(show_my_info.name)

    print(show_my_info.age)
    show_my_info.age = 20
    print(show_my_info.age)

    print(show_my_info.gender)
    show_my_info.gender = "boy"
    print(show_my_info.gender)

    
运行结果:
zhangwanqiang
z3
18
20
男
boy

注意:这种方法对属性进行封装,可以混淆用户(感觉没有封装),但是属性确实被封装起来了。

1.3 属性的封装 三

装饰器

class MyInfo(object):

    def __init__(self, name, age, gender):
        self.__name = name
        self.__age = age
        self.__gender = gender

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

    @name.setter
    def name(self, name):
        self.__name = name

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

    @age.setter
    def age(self, age):
        self.__age = age

    @property
    def gender(self):
        return self.__gender

    @gender.setter
    def gender(self, gender):
        self.__gender = gender


if __name__ == '__main__':
    show_my_info = MyInfo("zhangwanqiang", 18, "男")
    # print(show_my_info.get_name())
    # show_my_info.set_name("zhangmazi")
    # print(show_my_info.get_name())

    print(show_my_info.name)
    show_my_info.name = "z3"
    print(show_my_info.name)

    print(show_my_info.age)
    show_my_info.age = 20
    print(show_my_info.age)

    print(show_my_info.gender)
    show_my_info.gender = "boy"
    print(show_my_info.gender)

    
运行结果:
zhangwanqiang
z3
18
20
男
boy

总结:在定义类的时候,一定要封装类,也就是一定要私有化属性,提供公开的set\get方法去访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值