与面试官谈笑风生 | Python面向对象之访问控制
Python 从设计之初就是一门面向对象的语言,面向对象思想的第一个要素就是封装。所谓封装,通俗的讲就是类中的属性和方法,分为公有和私有,公有可以被外界访问,私有不能被外界访问,这就是封装中最关键的概念——访问控制。 访问控制有三种级别:私有、受保护、公有 私有(Private):只有类自身可以访问 受保护(Protected):只有类自身和子类可以访问 公有(Public):任何类都可以访问 由于 Python 不像 Java,有访问控制符(private / public / protected),所以 Python 的访问控制也是容易被应聘者忽视和搞错的。 公有(Public) 在 Python 的类中,默认情况下定义的属性都是公有的。 class Foo(object): bar = 123 def __init__(self, bob): self.bob = bob print(Foo.bar) # 123 foo = Foo(456) print(foo.bob) # 456 上面类Foo中的bar属性就是类属性,__init__方法中定义的 bob 是实例属性,bar和bob都是公有的属性,外部可以访问,分别 print 类中的bar和实例中的bob,输出了对应的值。 受保护(Protected) 在 Python 中定义一个受保护的属性,只需要在其名字前加一个下划线_,我们将 Foo 方法中的bob和bar改为_bob和_bar,他们就变成了受保护的属性了,代码如下: class Foo(object): _bar = 123 def __init__(self, bob): self._bob = bob class Son(Foo): def print_bob(self): print(self._bob) @classmethod def print_bar(cls): print(cls._bar) Son.print_bar() # 123 son = Son(456) son.print_bob() # 456 定义一个类Son继承自Foo,由于受保护的对象只能在类的内部和子类中被访问,不能直接调用print(Son._bar)或print(son._bob)来输出这两个属性的值,所以定义了print_bar和print_bob方法,实现在子类中输出,这段代码也正常的输出了_bar和_bob的值。 ...