跳至主要内容

类变量、属性和方法

Class variables, attributes, and properties

Python 是一种支持不同类型变量和属性的强大语言。在本文中,我们将讨论 Python 中的变量、属性和方法,以帮助你更好地理解它们。

理解变量、属性和方法

  • 变量:变量是引用值的名称。变量可以保存任何类型的对象。
  • 属性:属性是与对象关联的值。可以使用点符号访问属性。
  • 方法:方法是一种将方法定义为属性的方式。使用 @property 装饰器创建方法。

Python 类变量

在 Python 中,类变量是一种在类的所有实例之间共享数据的强大方式。让我们探索如何创建、访问和修改类变量。

创建类变量

要创建 Python 中的类 变量,只需在类中但在任何方法之外声明它即可。类变量在类的所有实例之间共享,可用于存储对从类创建的所有 对象 都通用的数据。

class Team:
    # Creating a class variable
    team_name = "Python Developers"

在此示例中,我们创建了一个类变量 team_name 来存储团队名称。

在 Python 中访问类变量

要访问类变量,可以使用类名后跟变量名,中间用点分隔。这允许你检索适用于类的所有实例的共享数据。

class Team:
    team_name = "Python Developers"

# Accessing the class variable using the class name
print("Team Name:", Team.team_name)  # Output: Team Name: Python Developers

在此示例中,类变量 team_name 使用类名 Team.team_name 访问。

修改类变量的值

修改类变量的值非常简单。使用类名引用变量并为其分配一个新值。

class Team:
    team_name = "Python Developers"

# Modifying the value of the class variable
Team.team_name = "Advanced Python Developers"

# Accessing the modified value
print("Team Name:", Team.team_name)  # Output: Team Name: Advanced Python Developers

在此示例中,我们通过使用类名修改类变量 team_name 的值。然后也可以通过类名访问更新后的值。

Python 实例变量

在 Python 中,实例变量对于类的每个实例都是唯一的。它们在类的函数中定义,并且特定于它们所属的对象。让我们探索如何创建实例变量并为它们分配值。

创建实例变量

要在 Python 中创建实例变量,可以在构造函数方法 __init__ 中定义它。构造函数是一个特殊方法,当创建类的对象时调用该方法。在构造函数内部,可以为对象初始化实例变量。

class Person:
    def __init__(self, name, age):
        # Creating instance variables
        self.name = name
        self.age = age

# Creating an instance of the Person class
person = Person("Alice", 30)

在此示例中,我们在 Person 类的 __init__ 方法中定义了两个实例变量 nameage。这些变量对于从类创建的每个 person 对象都是唯一的。

为实例变量分配值

您可以通过向构造函数传递参数,在对象创建期间为实例变量分配值。此外,您可以在对象创建后的任何时间修改或更新实例变量的值。

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

# Creating an instance of the Person class
person = Person("Alice", 30)

# Modifying the values of instance variables
person.name = "Bob"
person.age = 35

在此示例中,我们首先创建了一个带有 nameage 初始值的 person 对象。稍后,我们通过直接向它们分配新值来修改这些实例变量的值。

实例变量是面向对象编程的重要组成部分,因为它们允许对象拥有自己的数据和状态。这些变量可以存储特定于每个对象的信息,从而可以轻松处理同一类的不同实例。

Python 类属性和方法

在 Python 中,类属性和属性的工作方式与变量类似,但它们提供了更多功能和控制。让我们深入了解如何定义和利用类属性和属性。

定义类属性

类属性在类的所有实例之间共享。它们在类中声明,但位于任何方法之外。可以使用类名访问类属性,它们对于存储所有从类创建的对象的公共数据特别有用。

class Animal:
    # Defining a class attribute
    kingdom = "Animalia"

在此示例中,我们定义了一个类属性 kingdom 来存储所有动物的王国分类。使用类名(如 Animal.kingdom)访问类属性。

使用属性

Python 中的属性是充当属性的特殊方法。它们使用 @property 装饰器创建,将方法定义为属性,提供诸如 getter、setter 和 deleter 之类的附加功能。

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value > 0:
            self._radius = value

# Creating an instance of the Circle class
circle = Circle(5)

# Accessing and modifying attributes using properties
print("Radius:", circle.radius)  # Output: Radius: 5
circle.radius = 7
print("Modified Radius:", circle.radius)  # Output: Modified Radius: 7

在此示例中,我们使用属性来控制对 radius 属性的访问。@property 装饰器定义一个 getter 方法,而 @radius.setter 定义一个 setter 方法。

Python 类属性和属性提供了增强类和对象行为的强大方法。它们使您能够封装数据并提供对属性的受控访问,从而使您的代码更健壮、更易于维护。

Python 类中的私有变量

在 Python 中,私有变量是仅打算在类中使用的属性或属性,不应从类外部访问或修改。它们通过在变量或属性名称之前添加双下划线 __ 来表示。

定义私有变量

要在 Python 中定义私有变量,可以在变量名称之前使用双下划线前缀 __。这表示不应从类外部访问或修改该变量。

class MyClass:
    def __init__(self, public_value, private_value):
        self.public_value = public_value
        self.__private_value = private_value

# Creating an instance of the MyClass class
obj1 = MyClass(5, 10)

在此示例中,我们在 MyClass 类中定义了一个私有变量 __private_value。它仅打算在类中使用。

访问私有变量

私有变量只能从类本身内部访问。尝试从类外部访问它们将导致 AttributeError。但是,您仍然可以使用类方法或属性访问它们。

class MyClass:
    def __init__(self, public_value, private_value):
        self.public_value = public_value
        self.__private_value = private_value

    def get_private_value(self):
        return self.__private_value

# Creating an instance of the MyClass class
obj1 = MyClass(5, 10)

# Accessing private variable using a class method
private_value = obj1.get_private_value()

在此示例中,我们在类中创建了一个方法 get_private_value 来访问私有变量 __private_value

私有变量对于封装数据和确保它不会被外部代码意外修改非常有价值。它们有助于维护类及其数据的完整性。

Python 全局变量

在 Python 中,全局变量是可以从程序的任何部分访问的变量,无论是在函数、类还是任何其他范围内。全局变量在任何函数或类之外定义,使其可以在任何地方访问。

定义全局变量

要在 Python 中定义全局变量,只需在任何函数或类之外声明它即可。这允许从代码中的任何位置访问和修改变量。

global_var = 10

在此示例中,我们定义了一个全局变量 global_var,其值为 10。此变量可以从程序中的任何位置访问和修改。

使用全局变量

全局变量可以在函数、类或任何其他范围内使用,而无需特殊声明。您可以直接从这些范围内访问和修改全局变量。

global_var = 10

class MyClass:
    def __init__(self):
        self.instance_var = global_var

# Creating an instance of the MyClass class
obj = MyClass()

# Accessing the global variable from within the class
print(obj.instance_var)  # Output: 10

在此示例中,全局变量 global_var 被访问并分配给 MyClass 类中的实例变量。

修改全局变量

修改全局变量的值非常简单。你可以在程序的任何部分访问并更新其值。

global_var = 10

def modify_global_variable():
    global global_var
    global_var = 20

# Modifying the global variable
modify_global_variable()

# Accessing the modified global variable
print(global_var)  # Output: 20

在这个示例中,我们创建了一个函数 `modify_global_variable`,它使用 `global` 关键字来修改全局变量 `global_var` 的值。在函数外部访问该变量时,此更改将得到反映。

Python 全局变量对于共享需要在程序的不同部分访问的数据非常有用。但是,必须谨慎使用它们,因为过度使用全局变量会使代码更难维护和理解。

检查类是否具有属性

在 Python 中,你可以使用内置函数 `hasattr()` 来检查类是否具有特定属性。此函数允许你确定类是否具有特定属性,使其成为动态属性检查的宝贵工具。

使用 `hasattr()`

要使用 `hasattr()`,请提供对象(在本例中为类或类的实例)和属性名称作为参数。该函数返回一个布尔值,指示该属性是否存在于类中。

class MyClass:
    var = 10

obj = MyClass()

# Checking if the class has an attribute
if hasattr(obj, 'var'):
    print('Object has var attribute')
else:
    print('Object does not have var attribute')

在此示例中,我们定义了一个具有属性 `var` 的类 `MyClass`。使用 `hasattr()`,我们检查 `obj` 实例是否具有 `var` 属性。

处理属性存在

在访问或修改属性之前,`hasattr()` 可帮助你编写更健壮的代码,方法是允许你检查属性是否存在。这可以防止程序中出现意外错误。

class MyClass:
    var = 10

obj = MyClass()

# Checking if the class has an attribute
if hasattr(obj, 'var'):
    # Accessing the attribute
    value = getattr(obj, 'var')
    print(f'Attribute var exists with value: {value}')
else:
    print('Object does not have var attribute')

在此扩展示例中,如果 `hasattr()` 确认 `var` 属性存在,我们使用 `getattr()` 安全地访问属性的值。

使用 `hasattr()` 可以提高代码的可靠性,并在使用 Python 类 中的动态属性时改善错误处理。它是属性验证的一种有用技术。

在 Python 中打印和检索类属性

在 Python 中,你可能希望列出和访问类的所有属性。没有用于打印所有属性的内置方法,但你可以使用循环和 dir() 函数来实现此目的。让我们探讨如何打印和检索类属性。

使用 `dir()`

Python 中的 `dir()` 函数 返回对象的全部属性的列表。虽然这包括内部属性和方法,但你可以过滤掉它们以获取类属性的列表。

class MyClass:
    var1 = 10
    var2 = 'hello'
    var3 = True

# List of all attributes (including internal ones)
attributes = dir(MyClass)

# Filtering and printing only class attributes
for attr in attributes:
    if not attr.startswith('__'):
        value = getattr(MyClass, attr)
        print(f'{attr}: {value}')

在此示例中,我们使用 `dir(MyClass)` 获取所有属性的列表。然后,我们过滤掉内部属性,并打印类属性的名称和值。

此技术允许你获取类中属性的概览。

使用 `vars()`

虽然 `vars()` 更常用于访问实例变量,但它也可以应用于类。它返回对象的 `__dict__` 属性,其中包含类属性。

class MyClass:
    var1 = 10
    var2 = 'hello'
    var3 = True

# Using vars() to retrieve class attributes
class_attrs = vars(MyClass)

for attr, value in class_attrs.items():
    print(f'{attr}: {value}')

在此示例中,我们使用 `vars(MyClass)` 检索类属性并打印它们的名称和值。

`dir()` 和 `vars()` 都提供了访问和显示类属性的方法,让你可以更好地理解和使用你的类。

类私有变量

在 Python 中,类私有变量是仅供在类中使用的变量,不应从类外部访问或修改。这些变量用双下划线前缀 `__` 表示。让我们探讨如何创建和使用类私有变量。

创建类私有变量

要在 Python 中创建类私有变量,请在类中的变量名前添加双下划线 `__`。此约定表示该变量不应从类外部直接访问。

class MyClass:
    __private_var = 10

在此示例中,我们创建了一个类私有变量 __private_var

访问类私有变量

尝试从类外部访问类私有变量将导致 AttributeError。私有变量旨在仅在类内使用,以封装数据。

class MyClass:
    __private_var = 10

    def get_private_var(self):
        return self.__private_var

obj = MyClass()

# Accessing the private variable using a class method
print(obj.get_private_var())  # Output: 10

在此示例中,我们在类内定义了一个方法 get_private_var,以访问私有变量 __private_var

类私有变量的作用

私有变量在封装数据和维护类的内部状态的完整性方面发挥着至关重要的作用。它们防止外部代码无意中修改或访问类内的敏感数据。

class BankAccount:
    def __init__(self, account_number, balance):
        self.__account_number = account_number
        self.__balance = balance

    def withdraw(self, amount):
        if amount > 0 and amount <= self.__balance:
            self.__balance -= amount
        else:
            print("Invalid withdrawal amount")

# Creating an instance of the BankAccount class
account = BankAccount("123456789", 1000)

# Attempting to directly access private variables (results in AttributeError)
# print(account.__account_number)
# print(account.__balance)

# Performing a withdrawal using a class method
account.withdraw(500)

在此示例中,BankAccount 类定义了私有变量 __account_number__balance,以封装敏感的账户数据。这些私有变量通过类方法(如 withdraw)进行访问和修改。

私有变量是面向对象编程中数据封装和访问控制的一个基本方面,确保维护类的完整性。

Python 类全局变量

在 Python 中,类全局变量是可以在程序的任何部分访问的变量。它们在任何函数或类外部定义,使其全局可用。让我们探讨如何创建和使用类全局变量。

创建类全局变量

要在 Python 中创建类全局变量,请在任何函数或类外部定义变量。全局变量可用于程序的所有部分。

global_var = 10

在此示例中,我们创建了一个类全局变量 global_var

访问类全局变量

类全局变量可以从程序的任何部分访问和使用,包括类和函数内部。

global_var = 10

class MyClass:
    def __init__(self):
        self.instance_var = global_var

obj = MyClass()

# Accessing the class global variable from within a class
print(obj.instance_var)  # Output: 10

在此示例中,我们定义了一个类全局变量 global_var,并从 MyClass 类中访问它。

类全局变量的作用

类全局变量提供了一种在程序的不同部分共享数据的方法。它们通常用于存储与整个应用程序相关的信息。

user_name = "John"

class User:
    def __init__(self, name):
        self.name = name

# Accessing the class global variable from within a class
new_user = User(user_name)
print(new_user.name)  # Output: John

在此示例中,类全局变量 user_name 存储用户名称,并且可以在 User 类中访问。

类全局变量在使数据在程序的不同部分可用方面发挥着重要作用,允许您共享信息并在整个代码库中保持一致性。

Python 中的公共、受保护和私有属性和方法

在 Python 中,属性可以具有不同的可见性和访问控制级别,具体取决于命名约定。这些级别包括公共、受保护和私有。

公共属性

公共属性没有名称限制。它们可以在代码的任何位置访问,无论是在类内还是类外。默认情况下,如果属性没有双下划线前缀的名称,则它被视为公共属性。

class Person:
    def __init__(self, name):
        self.name = name  # Public attribute

class Circle:
    def __init__(self, radius):
        self.radius = radius  # Public attribute

class MyClass:
    def __init__(self, value):
        self.value = value  # Public attribute

# Accessing public attributes and properties
person = Person("Alice")
print(person.name)  # Output: Alice

circle = Circle(5)
print(circle.radius)  # Output: 5

obj = MyClass(42)
print(obj.value)  # Output: 42

在上面的示例中,诸如 nameradiusvalue 之类的属性是公共属性,可以从类外部访问。

受保护属性

在 Python 中,可以通过在属性名称前加上一个下划线来将属性标记为受保护属性。这是一个命名约定,表明不应该从类外部直接访问这些属性,尽管仍然可以访问它们。

class Employee:
    def __init__(self, name, _salary):
        self.name = name
        self._salary = _salary  # Protected attribute

    def _get_salary(self):
        return self._salary  # Protected method

# Accessing protected attributes and methods
employee = Employee("Bob", 50000)
print(employee._salary)  # Output: 50000
print(employee._get_salary())  # Output: 50000

Employee 类中,_salary 被标记为受保护属性。虽然它可以访问,但单个下划线表示不应该直接访问它。

私有属性

在 Python 中,可以通过在属性和特性的名称前加上双下划线来将其设为私有。此命名约定意味着不应该从类外部直接访问这些属性。尝试这样做会导致名称混淆转换。

class BankAccount:
    def __init__(self, account_number, __balance):
        self.account_number = account_number
        self.__balance = __balance  # Private attribute

    def __get_balance(self):
        return self.__balance  # Private method

# Attempting to access private attributes and methods
account = BankAccount("123456789", 1000)

# Results in an AttributeError
# print(account.__balance)
# print(account.__get_balance())

BankAccount 类中,__balance 是私有属性,而 __get_balance 是私有方法。尝试从类外部访问它们会导致 AttributeError。

与我们一起贡献!

请随时在 GitHub 上为 Python 教程做出贡献:创建分支,更新内容并发出拉取请求。

Profile picture for user AliaksandrSumich
Python 工程师,第三方 Web 服务集成专家。
更新:05/03/2024 - 21:52
Profile picture for user angarsky
已审阅并批准