MST

星途 面试题库

面试题:Python类中属性与方法的访问控制

在Python类中,如何通过不同的方式控制属性和方法的访问权限(如公有、私有)?请举例说明如何定义私有属性和私有方法,以及如何在类内部和外部访问它们。
20.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

在Python中,并没有严格意义上像其他语言那样的公有、私有访问权限控制,而是通过约定俗成的方式来模拟。

  1. 公有属性和方法: 直接定义的属性和方法就是公有的,可以在类内部和外部自由访问。
    class MyClass:
        def __init__(self):
            self.public_attr = "This is a public attribute"
        def public_method(self):
            return "This is a public method"
    obj = MyClass()
    print(obj.public_attr)
    print(obj.public_method())
    
  2. 私有属性和方法: 在Python中,在属性或方法名前加上双下划线 __ 来表示私有(实际是一种名称改写机制)。
    • 定义私有属性和方法
    class MyClass:
        def __init__(self):
            self.__private_attr = "This is a private attribute"
        def __private_method(self):
            return "This is a private method"
    
    • 在类内部访问私有属性和方法
    class MyClass:
        def __init__(self):
            self.__private_attr = "This is a private attribute"
        def __private_method(self):
            return "This is a private method"
        def access_private(self):
            result = self.__private_method()
            return result + " and " + self.__private_attr
    obj = MyClass()
    print(obj.access_private())
    
    • 在类外部访问私有属性和方法(不推荐,但可以通过名称改写机制访问): 私有属性和方法会被Python解释器进行名称改写,实际的名称变为 _类名__属性名_类名__方法名
    class MyClass:
        def __init__(self):
            self.__private_attr = "This is a private attribute"
        def __private_method(self):
            return "This is a private method"
    obj = MyClass()
    print(obj._MyClass__private_attr)
    print(obj._MyClass__private_method())
    
    但这种在外部访问私有属性和方法的方式破坏了封装性,不推荐在实际代码中使用。通常应通过类提供的公有方法来间接访问私有成员。