您现在的位置是:首页 >学无止境 >类成员与实例成员,私有成员与公有成员网站首页学无止境
类成员与实例成员,私有成员与公有成员
在Python中,类是一种面向对象的编程方法,它定义了一组共享相同属性和方法的对象的抽象模板。当我们创建一个类时,会定义该类的各个属性和方法。其中,数据成员分为实例数据成员和类数据成员。
实例数据成员是属于类的每个实例(对象)的数据,通常在构造函数__init__()中定义,并以self作为前缀。在类外部,实例属性只能通过对象名访问。例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person1 = Person("Tom", 20)
print(person1.name) # 输出 Tom
在上述代码中,name和age是Person类的实例数据成员。在构造函数__init__()中定义并以self作为前缀,因此它们属于Person对象的属性。在主程序中,我们可以通过person1.name的方式访问person1对象的name属性。
类数据成员则是属于整个类的数据,通常是在类的所有方法之外定义的。类属性可以通过类名或对象名访问。例如,在下面的代码示例中,我们定义了一个类属性num_of_persons来表示Person类创建的对象数量:
class Person:
num_of_persons = 0
def __init__(self, name, age):
self.name = name
self.age = age
Person.num_of_persons += 1
person1 = Person("Tom", 20)
person2 = Person("Jerry", 25)
print(Person.num_of_persons) # 输出 2
在上述代码中,num_of_persons是Person类的类数据成员。它不依赖于类的任何一个实例,因此可以通过类名或对象名访问。在类之外,我们可以通过Person.num_of_persons来访问该属性。在类的内部,我们也可以使用self.num_of_persons或Person.num_of_persons访问这个类属性。
在类的方法中,我们可以调用类本身的其他方法、访问类属性以及对象属性。例如,在下面的代码示例中,我们定义了一个静态方法together(),该方法访问了Person类的类属性num_of_persons:
class Person:
num_of_persons = 0
def __init__(self, name, age):
self.name = name
self.age = age
Person.num_of_persons += 1
@staticmethod
def together():
print(f"There are {Person.num_of_persons} persons in total.")
person1 = Person("Tom", 20)
person2 = Person("Jerry", 25)
Person.together() # 输出 There are 2 persons in total.
在上述代码中,together()是一个静态方法,可以通过Person.together()或person1.together()的方式调用。在该方法中,我们使用了Person.num_of_persons访问Person类的类属性。
Python中很特殊的一点是,可以动态地为类和对象增加成员,包括属性和方法。这使得Python非常适合于动态编程和快速原型开发。例如,在下面的代码示例中,我们动态地为Person类增加了一个属性address:
class Person:
num_of_persons = 0
def __init__(self, name, age):
self.name = name
self.age = age
Person.num_of_persons += 1
person1 = Person("Tom", 20)
person1.address = "Shanghai"
print(person1.address) # 输出 Shanghai
在上述代码中,我们通过person1.address = "Shanghai"为person1对象动态添加了属性address,并且可以通过person1.address访问该属性。
Python类型的动态性使得我们可以动态为自定义类及其对象增加新的属性和行为,俗称混入(mixin)机制,这在大型项目开发中会非常方便和实用。
例如系统中的所有用户分类非常复杂,不同用户组具有不同的行为和权限,并且可能会经常改变。这时候我们可以独立地定义一些行为,然后根据需要来为不同的用户设置相应的行为能力
综上所述,Python中具有动态性,它允许我们在运行时动态地增加或修改类和对象的属性和方法,这是和很多面向对象语言不同的一点,也是Python动态类型的特点之一。
总结
属于实例的数据成员一般是指在构造函数__init__()中定义的,定义和使用时必须以self作为前缀;属于类的数据成员是在类中所有方法之外定义的。
在主程序中(或类的外部),实例属性属于实例(对象),只能通过对象名访问;而类属性属于类,可以通过类名或对象名访问。
在类的方法中可以调用类本身的其他方法,也可以访问类属性以及对象属性。
在Python中比较特殊的是,可以动态地为类和对象增加成员,这一点是和很多面向对象程序设计语言不同的,也是Python动态类型特点的一种重要体现。