在面向对象开发中,使用类创建出来的实例是一个对象,那么,类是否是一个对象呢?

0x01:实例对象

通过类创建的对象被称为实例对象,对象属性又称为实例属性,记录对象各自的数据,不同对象的同名实例属性,记录的数据各自独立,互不干扰。

  1. class Person(object):
  2. def __init__(self,name,age):
  3. # 这里的name和age都属于是实例属性,每个实例在创建时,都有自己的属性
  4. self.name = name
  5. self.age = age
  6. # 每创建一个对象,这个对象就有自己的name和age属性
  7. p1 = Person('张三',18)
  8. p2 = Person("李四",20)

0x02:类属性

类属性就是类对象所拥有的属性,它被该类的所有实例对象所共有,类属性可以通过类对象或者实例对象访问。

  1. class Dog:
  2. type = "狗" # 类属性
  3. dog1 = Dog()
  4. dog2 = Dog()
  5. # 不管是dog1、dog2还是Dog类,都可以访问到type属性
  6. print(Dog.type) # 结果:狗
  7. print(dog1.type) # 结果:狗
  8. print(dog2.type) # 结果:狗

0x03:使用场景

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

0x04:注意点

1>尽量避免类属性和实例属性同名。如果有同名实例属性,实例对象会优先访问实例属性。

  1. class Dog(object):
  2. type = "狗" # 类属性
  3. def __init__(self):
  4. self.type = "dog" # 对象属性
  5. # 创建对象
  6. dog1 = Dog()
  7. print(dog1.type) # 结果为 “dog” 类属性和实例属性同名,使用 实例对象 访问的是 实例属性

2>类属性只能通过类对象修改,不能通过实例对象修改

  1. lass Dog(object):
  2. type = "狗" # 类属性
  3. # 创建对象
  4. dog1 = Dog()
  5. dog1.type = "dog" # 使用 实例对象 创建了对象属性type
  6. print(dog1.type) # 结果为 “dog” 类属性和实例属性同名,访问的是实例属性
  7. print(Dog.type) # 结果为 "狗" 访问类属性
  8. # 只有使用类名才能修改类属性
  9. Dog.type = "土狗"
  10. print(Dog.type) # 土狗
  11. dog2 = Dog()
  12. print(dog2.type) # 土狗

3>类属性也可以设置为私有,前边添加两个下划线。 如:

  1. class Dog(object):
  2. count = 0 # 公有的类属性
  3. __type = "狗" # 私有的类属性
  4. print(Dog.count) # 正确
  5. print(Dog.__type) # 错误,私有属性,外部无法访问。