7.6. 类属性和实例属性

类里定义的变量属性---> 类属性 类名.属性名 使用
实例化后自己定义或者__init__构建的   ---->实例名.属性名 使用

7.6.1. 实例属性

通过在__init__中定义的属性都是实例化后自动继承的实例属性 也可以在实例化之后自己再次定义实例属性,通过 实例名称.属性名 进行调用

  • 实例属性

实例属性是指定义在类的方法中的属性,只作用于当前实例中。

类属性

  • 类属性

类属性是指定义在类中,并且在函数体外的属性,类属性可以在类的所有实例之间共享值, 也就是在所有实例化的对象中公用。

类属性共享数据

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/6/10 22:56
# filename: 实例属性共享数据.py

class Rectangle():
    recs = []

    def __init__(self, w, l):
        self.width = w
        self.len = l
        self.recs.append((self.width,
                          self.len))

    def print_size(self):
        print("""{} by {}
              """.format(self.width,
                         self.len))


r1 = Rectangle(10, 24)
r2 = Rectangle(20, 40)
r3 = Rectangle(100, 200)

print(Rectangle.recs)

输出结果

[(10, 24), (20, 40), (100, 200)]

用代码来理解

代码示例 1

#!/usr/bin/env python
#-*- coding:utf8 -*-
class A:
    #类变量
    bb = 11
    def __init__(self,x,y):
        #实例变量
        self.x = x
        self.y = y

a = A(2,3)
A.bb = 111111
print(a.x,a.y,a.bb)    # 2 3 111111
print(A.bb)            # 111111

a.bb = 2222     #实际上会在实例对象a里面新建一个属性bb
print(a.bb)          # 2222
print(A.bb)          # 111111

代码示例 2

#!/usr/bin/env python
#-*- coding:utf8 -*-

class DaYan(object):
    neck = "脖子较长"
    wing = "振翅频率较高"
    leg = "腿是身体的中心支点"       #类属性

    def __init__(self,yumao,hui,eyes):
        self.yumao = yumao          #实例属性
        self.hui = hui
        self.eyes = eyes

    def fly(self):
        print("我的特性是:羽毛:{},喙:{},眼睛:{}".format(self.yumao,self.hui,self.eyes))
        print("我是{},我的方法是{}".format(str(self.__class__).strip("<").strip(">").strip("'").split(".")[1], "fly...."))

    def Jump(self, jump="我会跳起来"):
        print("我的特性是{}".format(jump))

    def exterior(self):
        print("我是大雁类 "
              "我的外观是:"
              "{}\n{}\n{}".format(DaYan.neck,DaYan.wing,DaYan.leg))

hu = DaYan("灰色","尖尖的","红色")
hu.fly()
hu.Jump("jump....")
hu.Jump()
hu.exterior()

代码示例 3

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""
1.实例属性
2.类属性
"""


class Demo_Property:
    class_name = "hujianli_class"  # 定义类属性

    def __init__(self, x=0):
        self.x = x  # 实例属性

    def class_info(self):
        print("类属性是{}".format(Demo_Property.class_name))
        print("实例属性是{}".format(self.x))

    def chang(self, x):
        'update class实例属性'
        self.x = x

    def chang_cn(self, name):
        Demo_Property.class_name = name




testa = Demo_Property()
testb = Demo_Property()
print("初始化两个实例:")
testa.class_info()
testb.class_info()
print("-" * 100)
print('修改testa实例变量:')
testa.chang(3)
testa.class_info()
testb.class_info()
print("-" * 100)
print('修改testb实例变量:')
testb.chang(10)
testa.class_info()
testb.class_info()
print("-" * 100)
print('修改testa类变量:')
testa.chang_cn(30)
testa.class_info()
testb.class_info()
print("-" * 100)
print('修改testb类变量:')
testb.chang_cn(100)
testa.class_info()
testb.class_info()