首页 >后端开发 >Python教程 >Python - 如何在类中定义公共、私有和受保护变量

Python - 如何在类中定义公共、私有和受保护变量

WBOY
WBOY原创
2024-09-12 10:22:19957浏览

Python -How to define public, private and protected variables in a class

介绍

Python 作为一种面向对象的编程语言,提供了多种将数据封装在类中的方法。
这种封装的关键方面之一是类变量的可见性,类变量可以分为公共变量、受保护变量和私有变量。在本文中,我们将探讨如何在 Python 类中定义公共、私有和受保护变量。

这些变量的行为与其他编程语言非常不同。这些访问控制只是Python中的命名约定,而不是对象的实际隐藏。

1. 公共变量

公共变量是最容易访问的变量类型。可以从课堂内外的任何地方访问它们。在Python中,除非明确定义,否则所有类变量默认都是公共的。

示例:

class MyClass:
    def __init__(self, name):
        self.name = name  # Public variable

obj = MyClass("John")
print(obj.name)  # Accessible outside the class
#Output : John

在此示例中,name 是一个公共变量。您可以从类外访问和修改它,没有任何限制。

2. 受保护的变量

受保护的变量只能在类及其子类中访问。虽然 Python 不强制执行严格的访问控制,但表示变量受保护的约定是在其名称前添加一个下划线 (_)。

示例:

class MyClass:
    def __init__(self, name, age):
        self._age = age  # Protected variable

class ChildClass(MyClass):
    def display(self):
        print(f"Age: {self._age}")  # Accessible within a subclass

obj = ChildClass("John", 30)
obj.display()  
# Output: Age: 30

在此示例中,年龄是受保护的变量。虽然 Python 不会阻止您直接在类外部访问它,但这样做违背了预期用途。

3. 私有变量

私有变量只能在定义它们的类中访问。 Python 通过在变量名前添加双下划线 (__) 来表示私有变量。这会触发名称修改,从而使从类外部访问私有变量变得更加困难(但并非不可能)。

示例:

class MyClass:
    def __init__(self, name, age, salary):
        self.__salary = salary  # Private variable

    def display_salary(self):
        print(f"Salary: {self.__salary}")  # Accessible within the class

obj = MyClass("John", 30, 50000)
obj.display_salary()  # Output: Salary: 50000

# Trying to access the private variable outside the class
print(obj.__salary)  # Raises AttributeError

在这个例子中,salary 是一个私有变量。如果您尝试直接从类外部访问它,Python 将引发 AttributeError。但是,您仍然可以使用名称损坏的版本来访问它,尽管不鼓励这样做。

名称修改示例:

print(obj._MyClass__salary)  # Output: 50000

这行代码演示了如何在内部重命名私有变量以包含类名称,从而使它们更难访问。

概括

  • 公共变量:可从任何地方访问;没有下划线。
  • 受保护的变量:在类及其子类中可访问;以单个下划线 (_) 为前缀。
  • 私有变量:只能在类内部访问;以双下划线 (__) 为前缀。

虽然 Python 的访问控制基于命名约定而不是严格执行,但遵循这些约定有助于保持代码的清晰度和完整性。了解如何定义和使用公共变量、受保护变量和私有变量对于 Python 中有效的面向对象编程至关重要。

以上是Python - 如何在类中定义公共、私有和受保护变量的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn