美文网首页Python开发(人工智能/大数据/机器学习)
24.Python编程:类中特殊的__slots__变量

24.Python编程:类中特殊的__slots__变量

作者: TensorFlow开发者 | 来源:发表于2018-04-24 20:18 被阅读5次

前面学习了类属性和实例属性,我们已经知道:实例属性属于各个实例对象所有,互不干扰;类属性属于类所有,所有实例共享一个属性。我们设计一个Car类:

# 定义一个Car类
class Car(object):
    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 15, 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'

通常,如果某个对象需要某个属性、方法,我们可以直接给其绑定属性、方法,但是,给一个实例绑定的属性、方法,对另一个实例是不起作用的,如上面的例子中的speed属性。

为了给所有实例都绑定属性、方法,可以给类Car绑定属性、方法。

现在我们还可以随意地给对象c3绑定一些测试属性:x, y, z:

c3 = Car()
c3.x = 'x'
c3.y = 'y'
c3.z = 'z'
print(c3.x)
print(c3.y)
print(c3.z)

运行结果:

x
y
z

那么问题来了:如果我想要限制实例的属性怎么办?比如,只允许对Car实例添加speedcolor属性。这就需要用到限制对象属性的属性了:__slots__

限制实例属性的属性__slots__

slots:本意是:狭孔、插板上的插槽等。此处表示

只需要在定义类时添加如下代码:__slots__ = 'speed', 'color'即可,只允许对Car实例添加speedcolor属性。Car类定义更新如下:

# 定义一个Car类
class Car(object):
    # 表示只允许对Car实例添加speed和color属性。
    __slots__ = 'speed', 'color'
    pass

同样再次随意绑定其他属性x,测试如下:

# 创建一个Car类对象
c3 = Car()

# 随意绑定一个属性x,并赋值‘x’
c3.x = 'x'

print(c3.x)

运行结果:

Traceback (most recent call last):
  File "F:/python_projects/oop/25Car.py", line 13, in <module>
    c.x = 'x'
AttributeError: 'Car' object has no attribute 'x'

这是由于'x'没有被放到__slots__中,所以不能绑定x属性,试图绑定x将得到AttributeError的错误。

如果,我们不是添加x,而是对Car实例添加speedcolor属性:

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

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

# 对Car类对象绑定speed\color属性:
c.speed = '200'
c.color = 'red'

print(c.speed)
print(c.color)

运行结果:

200
red

小结及注意

1.使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。
定义一个大众汽车类DaZhong,继承自Car类,并对DaZhong类的一个实例绑定除speed\color之外的属性,比如:logo属性,代码如下:

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


# 定义一个大众汽车类,继承自Car:
class DaZhong(Car):
    pass

# 创建DaZhong类的一个实例
d = DaZhong()

# 对DaZhong类对象绑定除speed\color之外的属性,比如:logo
d.logo = "DaZhong's logo"

print(d.logo)

运行结果:

DaZhong's logo

可以绑定成功。验证了:__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

2.__slots__限制的是类的实例的属性,且不能和类属性有重名的,否则报错。

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

运行结果:

Traceback (most recent call last):
  File "F:/python_projects/oop/25Car.py", line 2, in <module>
    class Car(object):
ValueError: 'color' in __slots__ conflicts with class variable

ValueError: 'color' in __slots__ conflicts with class variable意思是: 值错误:__slots__里面的color属性和类属性color冲突了


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


微信公众号:人人懂编程

相关文章

  • 24.Python编程:类中特殊的__slots__变量

    前面学习了类属性和实例属性,我们已经知道:实例属性属于各个实例对象所有,互不干扰;类属性属于类所有,所有实例共享一...

  • _slots_简介2-使用

    __slots__作用 类成员变量描述符 __slots__是一个元祖 类的实例只能拥有__slots__中定义的...

  • 小白学Python之第十四天

    定制类 写在前面:看到类似__slots__这样形如__xxx__的变量或者函数名就要注意,这些在python中是...

  • Python进阶话题杂谈(四)__slots__

    __slots__是Python类中的一个非常重要的优化手段。使用了__slots__的类,其在内存占用、实例化以...

  • __slots__

    __slots__变量,来限制class实例能添加的属性 例:

  • C语言基础教程之存储类

    编程中变量还有生命长短?C语言四种不同的存储类变量 存储类定义C程序中变量和/或函数的范围(可见性)和生命周期。它...

  • Java类、抽象类、接口的异同

    类 Java是面向对象的编程语言,类是对象的结构框架,类中定义了对象的成员变量和方法,此外还可以有类本身的静态变量...

  • Python 面向对象高级编程

    使用__slots__ 使用@property 多重继承 定制类 使用枚举类 使用元类

  • shell编程-bash shell中的特殊变量

    1.介绍 shell有很多以$开头的特殊变量,以下是对于这些变量的说明: 2.例子 下面通过一个例子解释怎么使用这...

  • Swift基础知识,快速掌握

    swift的语法确实高端,用习惯了编程特别顺手。 swift中的变量分为两类,变量(var)和常量(let),常量...

网友评论

    本文标题:24.Python编程:类中特殊的__slots__变量

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