Python类实例属性和类属性分析

先编写一个类Person:

#Python 2.6.2
class Person:

     #members
     Name = ""
     Age = 18
    
     #constructor
     def __init__(self):
          pass

下边声明两个实例,并输出属性:

person1 = Person()
person2 = Person()
print person1.Age,person2.Age,Person.Age #18 18 18

是不是有些奇怪怎么Person.Age的值也是18,那类中的Age到底是实例属性还是类属性?我们再输出各实例成员信息看看:

print person1.__dict__
#{}
print person2.__dict__
#{}
print Person.__dict__
#{'Age': 18, '__module__': '__main__', 'Name': '', '__init__': <function __init__ at 0x012B25F0>, '__doc__': None}

可见类中的Age应是类属性,而获取实例属性时实际上是获取类属性的值。

再做个测试:

person1.Age = 20
print person1.Age,person2.Age,Person.Age #20 18 18
print person1.__dict__
#{'Age': 20}
print person2.__dict__
#{}
print Person.__dict__
#{'Age': 18, '__module__': '__main__', 'Name': '', '__init__': <function __init__ at 0x012B25F0>, '__doc__': None}

测试说明:仅当对实例属性赋过值后,实例属性才真正存在,未对实例属性赋值前,获取实例属性值时将获取同名类属性的值!

下边对类属性赋值,再看下结果:

Person.Age = 22
print person1.Age,person2.Age,Person.Age #20 22 22
print person1.__dict__
#{'Age': 20}
print person2.__dict__
#{}
print Person.__dict__
#{'Age': 22, '__module__': '__main__', 'Name': '', '__init__': <function __init__ at 0x012B25F0>, '__doc__': None}

person1.Age为实例属性值,person2.Age和Person.Age均为类属性的值。

再来看一个例子:

class Person:

     #constructor
     def __init__(self):
          self.Name = 'dnawo'
          self.Age = 27

person = Person()

print person.__dict__
#{'Age': 27, 'Name': 'dnawo'}
print Person.__dict__
#{'__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x012B25F0>}

从测试结果可知:

在类中声明的变量皆为类属性,只有给self设置的属性才为实例属性。当获取一个实例属性值时,若在类中有定义该实例属性,则返回实例属性值;若在类中没有定义该实例属性,则返回同名类属性值,若没有同名类属性,则报错。

实际上,类属性和实例属性可以不要在定义类的时候定义,随时都可以定义:

person3 = Person()
person3.Marks = 100
Person.ClassName = 'Person'
print person3.Marks
print Person.ClassName

print person3.__dict__
#{'Marks': 100}
print Person.__dict__
#{'__module__': '__main__', 'Name': '', 'Age': 18, 'ClassName': 'Person', '__doc__': None, '__init__': <function __init__ at 0x012B25F0>}

实例属性和类属性虽然可以随处定义,但一定要先定义再使用,否则会报错!

参考

·谈谈python中类属性和类实例的属性的区别

评论: 0 | 引用: 0 | 查看次数: 5253
发表评论
登录后再发表评论!