在 Python 中,类中定义的属性或变量被称为属性。属性提供了关于类包含的数据类型的信息。Python 中有两种类型的属性:实例属性和类属性。
实例属性是在 Python 类的构造函数中定义的,并且对类的每个实例都是唯一的。而类属性是在类的构造函数之外声明和初始化的。
类属性(变量)
类属性是属于类的那些变量,并且其值在该类的所有实例之间共享。类属性对于类的每个实例都是一样的。
类属性在类中定义但在任何方法之外。它们不能在 __init__()
构造函数内初始化。它们可以通过类名加上对象来访问。换句话说,类属性对类及其对象都是可用的。
访问类属性
通过对象名称后跟点符号(.)来访问类属性。
示例
下面的例子展示了如何访问 Python 类的属性。
class Employee:
name = "Bhavesh Aggarwal"
age = "30"
emp = Employee()
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
修改类属性
要修改类属性的值,我们只需要使用类名加上点符号和属性名称给它赋一个新值即可。
示例
在下面的例子中,我们在 Employee
类中初始化了一个叫做 empCount
的类变量。对于每个声明的对象,__init__()
方法都会自动调用。这个方法不仅初始化实例变量,还会使 empCount
加一。
class Employee:
empCount = 0
def __init__(self, name, age):
self.__name = name
self.__age = age
Employee.empCount += 1
print ("Name:", self.__name, ", Age: ", self.__age)
print ("Employee Count:", Employee.empCount)
e1 = Employee("Bhavana", 24)
print()
e2 = Employee("Rajesh", 26)
输出:
Name: Bhavana , Age: 24
Employee Count: 1
Name: Rajesh , Age: 26
Employee Count: 2
每次声明对象时,empCount
都会递增 1。
类属性的重要性
类属性重要性的原因如下:
-
它们用于定义类的那些属性,这些属性应该对该类的每个对象具有相同的值。
-
-
这在创建单例时也很有用。单例是指只实例化一次并在代码的不同部分使用的对象。
内置类属性
每个 Python 类都保留了以下内置属性,并且可以像使用任何其他属性一样使用点操作符访问它们:
序号 |
属性 |
描述 |
1 |
__dict__ |
包含类命名空间的字典。 |
2 |
__doc__ |
类文档字符串或未定义时为 None。 |
3 |
__name__ |
类名。 |
4 |
__module__ |
定义类的模块名。在交互模式下,此属性为 "main"。 |
5 |
__bases__ |
包含基类的元组,按照它们在基类列表中出现的顺序。 |
访问内置类属性
为了在 Python 中访问内置类属性,我们使用类名加上点(.)然后是属性名称。
示例
对于 Employee
类,我们尝试访问所有内置类属性:
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
,并且使用这个参数定义实例属性。
示例
在下面的代码中,我们展示了实例属性的工作原理。
class Student:
def __init__(self, name, grade):
self.__name = name
self.__grade = grade
print ("Name:", self.__name, ", Grade:", self.__grade)
student1 = Student("Ram", "B")
student2 = Student("Shyam", "C")
输出:
Name: Ram , Grade: B
Name: Shyam , Grade: C
实例属性与类属性对比
下表展示了实例属性与类属性之间的区别:
序号 |
实例属性 |
类属性 |
1 |
它直接定义在 __init__() 函数内部。 |
它在类内部但 __init__() 函数之外定义。 |
2 |
实例属性通过使用对象名称后跟点符号访问。 |
类属性可以通过类名和对象名称访问。 |
3 |
此属性的值不能与其他对象共享。 |
其值在类的其他对象之间共享。 |
4 |
对实例属性所做的更改仅影响其定义所在的对象。 |
对类属性所做的更改影响给定类的所有对象。 |