Cris 的Python笔记(九):面向对象三大特征之封装

版权声明:转载请注明出处~ 摸摸博主狗头 https://blog.csdn.net/cris_zz/article/details/83650070
'''
Python 面向对象三大特性之一:封装
    Python 中对象的
    属性通过getter和setter方法获取以及修改,通过类的构造方法为其赋值(Python中没有无参构造的概念)
    类中构造方法定义的属性名如果不以__开头,则对象可以通过对象.属性名的方式来随意访问和修改,如果属性名以__开头,那么对象只能通过属性的getter和setter方法获取或者修改
    实际上__属性名在Python 内部被修改为了_类名__属性名,所谓的隐藏其实也是 "假隐藏"
    所以不推荐使用__属性名的形式

    通常情况下,如果不希望属性被外界直接可见以及修改,可以通过_属性名的方式定义为私有属性,同时提供setter 和getter 方法
'''


class Student:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

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


s1 = Student('cris')
print(s1.get_name())    # cris
s1.set_name('老二爹')
# print(s1.___name)   # 报错
print(s1.get_name())    # 老二爹

# @property 装饰器,直接将getter 方法转换为对象的属性,添加这个注解以后,可以通过像调用属性一样调用getter方法
# @属性名.setter 注解可以用来像调用属性一样调用setter 方法
# 最好这两个注解同时使用,如果仅仅使用@属性名.setter 注解将会报错~


class Teacher:
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        print('调用了getter方法')
        return self._name

    @name.setter
    def name(self, name):
        print('调用了setter方法')
        self._name = name


t1 = Teacher('cris')
print(t1.name)  # cris,实质上还是调用的name()方法
t1.name = 'james'
print(t1.name)  # james, 实质上调用的是类的_name 属性的getter方法

# 总结:在类的初始化方法__init__()初始化对象的属性,其中形参名正常定义,类的属性名最好定义为_属性名,避免对象直接通过对象.属性名来访问和修改属性
# 然后使用@property 和 @属性名.setter 注解来定义属性的getter 和 setter 方法

猜你喜欢

转载自blog.csdn.net/cris_zz/article/details/83650070