面向对象编程(8)封装

程序设计追高内聚,低耦

  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
  • 低耦合:仅对外暴露少量的方法用于使用。
    隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。
    通俗的说,把该隐藏的隐藏起来,该暴露的暴露岀来。这就是封装性的设计思想。
    1、私有属性
    内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,
class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.__score = score


alvin = Student("alvin",66)
yuan = Student("yuan",88)

print(alvin.__score)

单下划线、双下划线、头尾双下划线说明:

  • 'foo': 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。

  • '_foo': 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问。(约定成俗,不限语法)

  • '__foo': 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

2、 私有方法
在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的:

class Base:
    def foo(self):
        print("foo from Base")

    def test(self):
        self.foo()

class Son(Base):
    def foo(self):
        print("foo from Son")

s=Son()
s.test()

class Base:
    def __foo(self):
        print("foo from Base")

    def test(self):
        self.__foo()

class Son(Base):
    def __foo(self):
        print("foo from Son")

s=Son()
s.test()

3、 property属性装饰器
使用 @property 装饰器时,接口名不必与属性名相同。

class Student(object):

    def __init__(self,name,score,sex):
        self.__name = name
      
    @property
    def name(self):
        return self.__name

yuan = Student('yuan')
yuan.name = 'alex'  #  调用了score(self, score)函数设置数据
print(yuan.name)   #  调用了score(self)函数获取数据

python提供了更加人性化的操作,可以通过限制方式完成只读、只写、读写、删除等各种操作

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

    def __get_name(self):
        return self.__name

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

    def __del_name(self):
        del self.__name
    # property()中定义了读取、赋值、删除的操作
    # name = property(__get_name, __set_name, __del_name)
    name = property(__get_name, __set_name)

yuan = Person("yuan")

print(yuan.name)   # 合法:调用__get_name
yuan.name = "苑昊"  # 合法:调用__set_name
posted @ 2021-12-05 23:43  下个ID见  阅读(37)  评论(0)    收藏  举报