📅  最后修改于: 2023-12-03 15:34:26.407000             🧑  作者: Mango
在 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
以上代码演示了如何限制属性的访问权限,私有属性只能通过公共方法访问和设置。受保护的属性可以在派生类中访问。