23.Python编程:类属性和实例属性

作者: TensorFlow开发者 | 来源:发表于2018-04-24 16:31 被阅读17次

在面向对象程序设计思想中,属性还是区分为类属性和实例属性的,但不同的编程语言有不同的定义。

在C++中,类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。正因为不同的编程语言有不同的定义,而有些语言是不区分static类型的,所以并不能用static来表示这个属性是否为类属性。只不过用static修饰的属性可以实现对象间的数据共享而已。

在面向对象的编程语言Python中,类属性就是在类中定义的变量。类属性归类所有,

# 定义一个智能手机类
class SmartPhone(object):
    os = ""  # 私有属性:系统
    type = ""  # 私有属性:品牌
    memory = "4GB"  # 私有属性:内存大小 默认单位GB

    # 构造方法
    def __init__(self, os, type, memory):
        self.os = os
        self.ype = type
        self.memory = memory

    def print_phone_info(self):
        print('os:', self.os, '\n品牌:', self.type, '\n内存大小:', self.memory)

这里,根据Python中,类属性的定义:在类中定义的变量,上面代码有3个类属性:os、type 、memory。通过类直接访问类属性,也可以通过对象访问类属性。例如:

# 上接

# 通过类直接访问类属性
print('通过类直接访问类属性: ', SmartPhone.os)

print('-------------')

p1 = SmartPhone("iOS 11", "Apple","6GB")
p1.print_phone_info()

# 通过对象也可访问类属性
print('通过对象也可访问类属性os:', p1.os)

运行结果:

通过类直接访问类属性:  系统
-------------
os: iOS 11 
品牌: Apple 
内存大小: 6GB
通过对象也可访问类属性os: iOS 11

为了简化python中类属性和实例属性,我们重新设计一个类,并给该类设计一个类属性color

# 定义一个Car类
class Car(object):
    color = 'white'
    pass

# 创建Car类的一个实例
c = Car()

# 打印color属性,因为实例并没有color属性,所以会继续查找class的color属性-->打印white
print('1:', c.color)

# 给实例c绑定对象属性color,并赋值:'black'
c.color = "black"

# 打印color属性,由于实例属性优先级比类属性高,因此,它会屏蔽掉类的color属性,打印black
print('2:', c.color)


# 打印类的color属性:white
print('3:', Car.color)

# 删除对象的color属性
del c.color

# 打印color属性,因为实例并没有了color属性,所以会继续查找class的color属性-->打印white
print('4:', c.color)

运行结果:

1: white
2: black
3: white
4: white

可见,当类属性和对象属性同名时,由于实例属性优先级比类属性高,因此,它会屏蔽掉类的同名属性。编写程序的时候,千万不要对实例属性和类属性使用相同的名字。但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

注意

# 定义一个Car类
class Car(object):
    color = 'white'
    pass

# 创建Car类的一个实例
c = Car()

# 给实例c绑定对象属性speed,并赋值:200
c.speed = 200

# 创建Car类的一个实例
c2 = Car()
print(c2.speed)

运行结果:

Traceback (most recent call last):
  File "F:/python_projects/oop/25Car.py", line 31, in <module>
    print(c2.speed)
AttributeError: 'Car' object has no attribute 'speed'

这里的speed属性只属于c对象。Car类中没有speed类属性,如果该类的其他对象(比如c2)在绑定speed属性前,则没有该属性,所以直接访问c2.speed会报错:AttributeError: 'Car' object has no attribute 'speed'

小结

实例属性属于各个实例对象所有,互不干扰;
类属性属于类所有,所有实例共享一个属性;
注意: 不要对实例属性和类属性使用相同的名字,否则将产生覆盖且难以发现的错误。


更多了解,可关注公众号:人人懂编程


微信公众号:人人懂编程

相关文章

  • 23.Python编程:类属性和实例属性

    在面向对象程序设计思想中,属性还是区分为类属性和实例属性的,但不同的编程语言有不同的定义。 在C++中,类属性是描...

  • python面向对象编程四要素总结

    面向对象编程的四要素: 类、属性、函数(方法)、对象(实例) 类: 一群有着相同属性和函数(方法)的对象(实例)的...

  • 类6.类的实例属性

    定义 类的实例属性,就是类的实例所拥有的属性,是实例的特色之处。和类的属性的区别:类的实例属性属于这个实例所拥有,...

  • Mr.Li--python-Linux-属性和方法

    类属性和实例属性 : 类属性: 实例属性(对象属性): ·如果需要在类外修改类属性,必须通过类对象去引用然后进行修...

  • TypeScript:属性装饰器

    回顾类的属性 回顾面向对象,类中的属性分为实例属性和静态属性,实例属性属于实例化后的对象,静态属性属于类本身 在类...

  • python 类属性和类方法

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使...

  • 面向对象基础

    类的相关知识 初识类 类有两种作用:属性引用和实例化 属性引用(类名.属性) 实例化:类名加括号就是实例化,会...

  • 面向对象的编程思想和Python的类,访问和属性,继承

    面向对象的编程思想和Python的类,类的方法和属性,实例方法这一文从面相对象的角度,介绍类的定义,类的属性和自定...

  • Python实例变量和类变量

    Python实例变量和类变量 类变量(类属性): 类变量属于类所有,所有实例共享一个变量 实例变量(实例属性) 实...

  • 面向对象的编程思想和Python的继承和多态,特殊方法,引用计数

    面向对象的编程思想和Python的类,访问和属性,继承在上一文中我们了解到了,私有的属性的访问方式:实例名._类名...

网友评论

    本文标题:23.Python编程:类属性和实例属性

    本文链接:https://www.haomeiwen.com/subject/hcjjlftx.html