类成员与实例成员,私有成员与公有成员

在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动态类型特点的一种重要体现。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值