python类属性,实例属性举例

python是门动态语言,类属性和实例的属性都可以在运行时确认。

 

可以总结为:

1)类属性,在类定义时以单独的名字呈现,不带self,为所有实例共享。在引用时,类和实例都可以引用,但只有类引用可以修改类的属性,实例引用时不可写。比如:

class OK():
dog = 1
animals = [100]
ducks = [1000]
def hello(self):
self.dog = 2

def haha(self):
self.dog = 3

def print_dog(self):
self.hello()
self.haha()
OK.dog = 10
self.animals = [100, 200]
self.ducks.append(2000)
print(self.dog)
ok = OK()
ak = OK()
dog,animals, ducks都是类属性,在引用时可以通过类名直接引用OK.dog, 也可以通过实例来引用ak.dog,但是要改变这个值,必须是OK.dog = xx来实现

2)使用实例对象引用属性稍微复杂一些,因为实例对象可引用类属性以及实例属性。但是实例对象引用属性时遵循以下规则:
  1. 总是先到实例对象中查找属性,再到类属性中查找属性;
  2. 属性绑定语句总是为实例对象创建新属性,属性存在时,更新属性指向的对象。

 

通过下列程序和结果可以理解得更深:

class OK():
dog = 1
cat = 0
animals = [100]
ducks = [1000]
def hello(self):
self.dog = 2

def haha(self):
self.dog = 3

def print_dog(self):
self.hello()
self.haha()
OK.dog = 10
self.animals = [100, 200]
self.ducks.append(2000)
print(self.dog)

if __name__ == '__main__':
ok = OK()
ak = OK()
print(id(OK.dog), id(ok.dog), id(ak.dog), OK.dog, ok.dog, ak.dog)

OK.dog = 5
ak.print_dog()
print(id(OK.dog), id(ok.dog), id(ak.dog), OK.dog, ok.dog, ak.dog)

ok.cat = 100
print(id(OK.cat), id(ok.cat), id(ak.cat),OK.cat, ok.cat, ak.cat)

print(id(OK.animals), id(ok.animals), id(ak.animals), OK.animals, ok.animals, ak.animals)
print(id(OK.ducks), id(ok.ducks), id(ak.ducks), OK.ducks, ok.ducks, ak.ducks)

运行结果:

7499128 7499128 7499128 1 1 1
3
7499416 7499416 7499192 10 10 3
7499096 7502296 7499096 0 100 0
281473037144192 281473037144192 281473037145408 [100] [100] [100, 200]
281473037133952 281473037133952 281473037133952 [1000, 2000] [1000, 2000] [1000, 2000]

注:语句self.ducks.append并不是属性绑定语句,因此还是在类属性上修改可变对象。

具体参考:https://www.cnblogs.com/crazyrunning/p/6945183.html

 

 

posted @ 2021-09-29 14:37  sunshore927  阅读(300)  评论(0)    收藏  举报