#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)
暂无评论。