Python的动态性和__slots__

Python是动态语言

在计算机科学领域已被广泛应用。它是一类在运行时可以改变其结构的语语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言非常具有活力。例如JavaScript便是动态语言,除此之外如PHP 、 Ruby 、 Python 等也都属于动态语言,C 、 C++ 则不属于动态语言!

运行的过程中给对象绑定(添加)属性

这个比较简单,格式:对象.属性 = 值即可

运行的过程中给类绑定(添加)属性

格式:类名.属性 = 值即可

运行的过程中给类绑定(添加)方法

#-*- coding:utf-8 -*-
import types

class Person(object):
    def __init__(self, newName, newAge):
        self.name = newName
        self.age = newAge

    def eat(self):
        print("----%s正在吃----" % self.name)




p = Person("老王", 20)
p.eat()

# 给对象绑定方法
def run(self):
    print("----%s正在跑----" % self.name)

p.run = types.MethodType(run, p)
p.run()

# 给Person类绑定类方法
@classmethod
def testClassMethod(cls):
    print("class method")

Person.testclass = testClassMethod
Person.testclass()

# 给Person类绑定静态方法
@staticmethod
def testStaticMethod():
    print("static method")

Person.teststatic = testStaticMethod
Person.teststatic()

__slots__

动态语言:可以在运行的过程中,修改代码

静态语言:编译器时期就已经确定代码,运行过程中不能修改

如果我们想要限制实例的属性怎么办?⽐如,只允许对Person实例添加name和age属性。
为了达到限制的⽬的,Python允许在定义class的时候,定义⼀个特殊的__slots__变量,来限制该class实例能添加的属性:

In [1]: class Person(object):
   ...:     __slots__ = ("name", "age")
   ...:

In [2]: p = Person()

In [3]: p.name = "XXX"

In [4]: p.age = 20

In [5]: p.other = "---"
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-dbbcced1d9ea> in <module>()
----> 1 p.other = "---"

AttributeError: 'Person' object has no attribute 'other'

注意

  • 使⽤__slots__要注意,__slots__定义的属性仅对当前类实例起作⽤,对继承的⼦类是不起作⽤的

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81459143
今日推荐