不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
Python类实例属性和类属性分析
编辑:dnawo 日期:2009-07-26
先编写一个类Person:
下边声明两个实例,并输出属性:
是不是有些奇怪怎么Person.Age的值也是18,那类中的Age到底是实例属性还是类属性?我们再输出各实例成员信息看看:
可见类中的Age应是类属性,而获取实例属性时实际上是获取类属性的值。
再做个测试:
测试说明:仅当对实例属性赋过值后,实例属性才真正存在,未对实例属性赋值前,获取实例属性值时将获取同名类属性的值!
下边对类属性赋值,再看下结果:
person1.Age为实例属性值,person2.Age和Person.Age均为类属性的值。
再来看一个例子:
从测试结果可知:
在类中声明的变量皆为类属性,只有给self设置的属性才为实例属性。当获取一个实例属性值时,若在类中有定义该实例属性,则返回实例属性值;若在类中没有定义该实例属性,则返回同名类属性值,若没有同名类属性,则报错。
实际上,类属性和实例属性可以不要在定义类的时候定义,随时都可以定义:
实例属性和类属性虽然可以随处定义,但一定要先定义再使用,否则会报错!
参考
·谈谈python中类属性和类实例的属性的区别
复制内容到剪贴板
程序代码

#Python 2.6.2
class Person:
#members
Name = ""
Age = 18
#constructor
def __init__(self):
pass
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
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}
#{}
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}
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}
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>}
#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>}
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
发表评论
请登录后再发表评论!