📜  python中的属性(1)

📅  最后修改于: 2023-12-03 15:34:26.407000             🧑  作者: Mango

Python 中的属性

在 Python 中,属性是指类的数据成员,可以是类变量或实例变量。它们可以被访问、读取、写入和删除。属性可以被定义为公共、私有或受保护。

实例属性和类属性

实例属性是指在实例化后,类的每个实例都有自己的实例属性。它们与实例相关联,并且只能通过实例访问。

类属性是指定义在类上的属性,它们与类有关联,并且可以被该类的所有实例共享。类属性可以通过类和实例访问。

以下是一个演示实例属性和类属性的例子:


class Person:
    species = "Human"  # 类属性

    def __init__(self, name):
        self.name = name  # 实例属性

在上面的示例中,species是类属性,它与Person类相关联。每个通过Person类实例化的对象都可以访问该属性。

name属性是实例属性,它只与每个实例相关联。name属性只能通过实例访问,而无法通过类访问。

属性的访问和设置

在 Python 中,属性可以被访问和设置。它们的访问和设置方式取决于属性是类属性还是实例属性。

访问属性

要访问属性,需要使用点号(.)来引用属性。如果属性是实例属性,则需要先实例化对象,然后使用对象访问该属性。如果属性是类属性,则可以直接使用类访问该属性。


class Person:
    species = "Human"
  
    def __init__(self, name):
        self.name = name
  
person1 = Person("Alice")
person2 = Person("Bob")

print(person1.name)  # 实例属性,输出 Alice
print(Person.species)  # 类属性,输出 Human

以上代码中,name属性是实例属性,需要通过实例来访问和打印。而species属性是类属性,它们是与类关联的,可以直接通过类进行访问和打印。

设置属性

要设置属性的值,可以使用点号(.)和赋值运算符(=)来设置属性的值。如果属性是实例属性,则需要先实例化对象,然后使用对象设置该属性的值。如果属性是类属性,则可以直接使用类设置该属性的值。


class Person:
    species = "Human"

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

person1 = Person("Alice")
person2 = Person("Bob")

# 设置实例属性 name 的值
person1.name = "Charlie"
print(person1.name)  # 输出 Charlie

# 设置类属性 species 的值
Person.species = "Alien"
print(person2.species)  # 输出 Alien
print(person1.species)  # 输出 Alien

以上代码中,name属性是实例属性,需要通过实例来设置其值。而species属性是类属性,可以通过类和实例来设置其值。设置类属性的值将会影响到所有与类相关联的实例。

属性的删除

在 Python 中,可以使用 del 关键字来删除属性。如果属性是实例属性,则需要先实例化对象,然后使用对象删除该属性。如果属性是类属性,则可以直接使用类删除该属性。


class Person:
    species = "Human"

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

person1 = Person("Alice")

# 删除实例属性 name
del person1.name
print(person1.name)  # 抛出异常,因为 name 属性不存在

# 删除类属性 species
del Person.species
print(person1.species)  # 抛出异常,因为 species 属性不存在

以上代码演示了如何删除属性。删除属性后,如果尝试访问该属性,会抛出异常。

限制属性的访问权限

在 Python 中,属性可以被限制为公共、私有或受保护。

  • 公共属性: 可以访问和修改。

  • 私有属性:只能访问和修改该类内部的方法。

  • 受保护的属性:可以通过派生类访问。

要限制属性的访问权限,可以在属性名称前面添加一个或两个下划线(__)。以两个下划线开始的属性是私有属性。以一个下划线开始的属性是受保护的属性。没有下划线的属性是公共属性。

以下是一个演示限制访问权限的示例:


class Person:
    species = "Human"
  
    def __init__(self, name, age, gender):
        self.__name = name  # 私有属性
        self._age = age  # 受保护的属性
        self.gender = gender  # 公共属性

    def get_name(self):
        return self.__name

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

person = Person("Alice", 30, "Female")

# 尝试直接访问私有属性
print(person.__name)  # 抛出异常,因为 __name 属性是私有属性

# 通过公共方法访问私有属性
print(person.get_name())  # 输出 Alice

# 通过公共方法设置私有属性
person.set_name("Bob")
print(person.get_name())  # 输出 Bob

# 通过受保护的属性进行访问
print(person._age) # 输出 30

以上代码演示了如何限制属性的访问权限,私有属性只能通过公共方法访问和设置。受保护的属性可以在派生类中访问。