类内定义的属性或变量被称为属性。 属性提供关于类所包含数据类型的信息。Python 中有两种属性类型,分别是实例属性 和类属性。
实例属性定义在 Python 类的构造器中,并且对该类的每个实例都是唯一的。而且,类属性会在类的构造子之外声明并初始化。
类属性(变量)
类属性是指属于某个类且其值在该类所有实例间共享的变量。类属性对该类的每个实例保持不变。
类属性在类中定义,但不在任何方法之外。它们不能在 init() 构造器中初始化。除了对象外,还可以通过类名访问它们。换句话说,类属性既对类可用,也对其对象开放。
访问类属性
对象名后加上点符号(.)用于访问类属性。
示例
下面的示例演示了如何访问 Python 类的属性。
class Employee:
name = "Bhavesh Aggarwal"
age = "30"
# instance of the class
emp = Employee()
# accessing class attributes
print("Name of the Employee:", emp.name)
print("Age of the Employee:", emp.age)
输出
Name of the Employee: Bhavesh Aggarwal
Age of the Employee: 30
修改类属性
要修改类属性的值,我们只需用类名和点符号和属性名为其分配一个新值。
示例
在下面的例子中,我们初始化一个名为empCount的类变量,位于Employee类中。对于每个声明的对象,init() 方法会自动调用。该方法初始化实例变量,并将empCount递增1。
python
class Employee:
# class attribute
empCount = 0
def __init__(self, name, age):
self.__name = name
self.__age = age
# modifying class attribute
Employee.empCount += 1
print ("Name:", self.__name, ", Age: ", self.__age)
# accessing class attribute
print ("Employee Count:", Employee.empCount)
e1 = Employee("Bhavana", 24)
print()
e2 = Employee("Rajesh", 26)
输出
我们已经宣布了两个对象。每次empCount都会增加1。
Name: Bhavana , Age: 24
Employee Count: 1
Name: Rajesh , Age: 26
Employee Count: 2
类别属性的重要性
类属性的重要性有以下原因:
- 它们用于定义类的属性,这些属性应对该类的每个对象具有相同的取值。
- 类属性可用于设置对象的默认值。
- 这在创建单元素集时也很有用。它们是只实例化一次,并在代码的不同部分使用对象。
内置属性
每个 Python 类都保留以下内置属性,并且像其他属性一样,可以通过点算子访问它们 −
-
dict − 包含类命名空间的词典。
-
doc − 类文档字符串或无类别文档,若未定义。
-
name − 类别名称。
-
module − 定义该类的模块名称。该属性在交互模式下为"main"。
-
bases − 一个可能为空的元组,包含基类,按基类列表中的出现顺序排列。
访问内置类属性
要访问 Python 内置的类属性,我们使用类名后接点(.),然后是属性名称。
示例
对于 Employee 类,我们尝试访问所有内置的类属性 −
python
class Employee:
def __init__(self, name="Bhavana", age=24):
self.name = name
self.age = age
def displayEmployee(self):
print ("Name : ", self.name, ", age: ", self.age)
print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__ )
输出
它将产生以下输出 −
Employee.__doc__: None
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {'__module__': '__main__', '__init__': <function Employee.__init__ at 0x0000022F866B8B80>, 'displayEmployee': <function Employee.displayEmployee at 0x0000022F866B9760>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__weakref__': <attribute '__weakref__' of 'Employee' objects>, '__doc__': None}
实例属性
如前所述,Python 中的实例属性是专门针对类中单个对象的变量。它在 init() 方法中定义。
该方法的第一个参数是 self,利用该参数定义实例属性。
示例
在以下代码中,我们将演示实例属性的工作原理。
python
class Student:
def __init__(self, name, grade):
self.__name = name
self.__grade = grade
print ("Name:", self.__name, ", Grade:", self.__grade)
# Creating instances
student1 = Student("Ram", "B")
student2 = Student("Shyam", "C")
输出
运行上述代码时,输出为 −
Name: Ram , Grade: B
Name: Shyam , Grade: C
实例属性与类属性
下表展示了实例属性与类属性的区别 −
| 序号 | 实例属性 | 类属性 |
|---|---|---|
| 1 | 它直接在 init() 函数中定义。 | 它在类内定义,但在 init() 函数之外。 |
| 2 | 实例属性通过对象名和点符号访问。 | 类属性可以通过类名和对象名访问。 |
| 3 | 该属性的值不能在其他对象之间共享。 | 其价值与类的其他对象共享。 |
| 4 | 对实例属性所做的更改只影响其所定义的对象。 | 对类属性的更改会影响该类的所有对象。 |
类属性的注意事项
-
避免通过实例修改类属性:如前文所述,通过实例修改类属性会创建同名实例属性,导致属性访问混乱,若需修改类属性,务必通过类名操作。
-
私有类属性的访问限制:私有类属性(__属性名)仅能在类内部访问,外部强制访问(_类名__属性名)会破坏封装性,不推荐使用。
-
类属性与实例属性同名时的优先级:若实例拥有与类属性同名的实例属性,实例会优先访问自己的实例属性(屏蔽类属性),如需访问类属性,需通过类名指定。
-
动态添加类属性:Python支持在类定义后,通过"类名.新属性名 = 属性值"动态添加类属性,添加后所有实例均可访问该新属性。
总结
Python类属性是类本身的属性,被所有实例共享,其核心价值在于"统一管理公共数据"。定义类属性时需放在类体内部、所有方法之外;访问类属性推荐通过类名,也可通过实例;修改类属性必须通过类名;私有类属性需通过类内部访问。
类属性与实例属性的核心区别在于"共享性"和"归属对象",合理使用类属性可简化代码、便于维护,常见于存储公共配置、统计实例个数、实现单例模式等场景。掌握类属性的使用规则,能帮助我们更高效地进行Python面向对象编程。