03-类属性和实例属性

类属性和实例属性

在类中定义的名字,都是类的属性,类有两种属性:数据属性和函数属性,通过__dict__访问属性的值

1 类属性

1.1 设置和访问类属性

  • 类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有
  • 类属性可以使用 类对象实例对象 访问。
class Dog(object):
    tooth = 10


wangcai = Dog()
xiaohei = Dog()

print(Dog.tooth)  # 10
print(wangcai.tooth)  # 10
print(xiaohei.tooth)  # 10

类属性的优点

  • 记录的某项数据 始终保持一致时,则定义类属性。
  • 实例属性 要求 每个对象 为其 单独开辟一份内存空间 来记录数据,而 类属性 为全类所共有 ,仅占用一份内存更加节省内存空间

1.2 修改类属性

类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。

class Dog(object):
    tooth = 10


wangcai = Dog()
xiaohei = Dog()

# 1.3 修改类属性
# 类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。
Dog.course = 'python'  # 新增,等同于obj1.__dict__['course']='python'
Dog.tooth = 12  # 修改,等同于obj1.__dict__['age'] = 12
print(Dog.tooth)  # 12
print(wangcai.tooth)  # 12
print(xiaohei.tooth)  # 12
print(Dog.course)
del Dog.course  # 删除,等同于del Dog.__dict__['course']

# 不能通过对象修改属性,如果这样操作,实则是创建了一个实例属性
wangcai.tooth = 20
print(Dog.tooth)  # 12
print(wangcai.tooth)  # 20
print(xiaohei.tooth)  # 12

2 实例属性

class Dog(object):
    def __init__(self):
        self.age = 5

    def info_print(self):
        print(self.age)


wangcai1 = Dog(18)
xiaohei1 = Dog(99)
# 实例属性
print(wangcai1.age)
# print(Dog.age)  # 报错:实例属性不能通过类访问
wangcai1.info_print()  # 5

# 2.1 类中定义的函数是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
Dog.info_print(wangcai1)
Dog.info_print(xiaohei1)

# 2.2 类中定义的函数主要是给对象使用的,而且是绑定给对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法,内存地址各不相同
print(id(Dog.info_print))  # 2118372007224
print(id(wangcai1.info_print))  # 2118368383176
print(id(xiaohei1.info_print))  # 2118368383176

# 2.3绑定到对象的方法特殊之处在于,绑定给谁就因该有谁来调用,谁来调用,就会将”谁“本身当作第一个参数自动传入(方法__init__也是一样)
wangcai1.info_print()  # Dog.info_print(wangcai1)
xiaohei1.info_print()  # Dog.info_print(xiaohei1)

# 类型list就是一个类
print(type(list))  # <class 'type'>

# 实例化得到3个对象l1,l2,l3
l1=list([1,2,3])
l2=list(['a','b','c'])
l3=list(['x','y'])
# 三个对象都有绑定方法append,是相同的功能,但内存地址不同

# 操作绑定方法l1.append(4),就是再往l1添加4,绝对不会将4添加到l2或l3
print(l1.append(4))  # 等同于list.append(l1,4)
print(l1)  # [1, 2, 3, 4]
print(l2)  # ['a', 'b', 'c']
print(l3)  # ['x', 'y']
posted @ 2021-01-26 11:31  啦啦哦  阅读(323)  评论(0编辑  收藏  举报