分享

【Python】 如何动态添加类属性与方法

 LibraryPKU 2020-02-15

一些概念

涉及到一些基础概念,本章要讨论的相关术语。但是有些概念又是一时半会讲不清楚,所以笔者尽量找到简练形象的描述,并附上参考链接。 

  • 对象
  • 属性
  • 方法
  • 实例

 

类(1) - 《零基础学python》(第二版):https://docs./learnpython/206/

 

对象(object):在面向对象编程中(OOP),万物都是对象。对象应该具有属性(就是上面的状态,因为属性更常用)、方法(就是上面的行为,方法跟常被使用)和标识。

既然万物都是对象,那么,某个具体的人也是对象,这是当然的事情。假设这个具体的人就是德艺双馨的苍老师,她是一个对象。这个苍老师具有哪些特征呢?我错了,写到这里发现不能用苍老师为对象的例子,因为容易让读者不专心学习了。我换一个吧,以某个王美女为对象说明(这个王美女完全是虚构的,请不要对号入座,更不要想入非非,如果雷同,纯属巧合)

 

属性:即状态(state),包括这个对象已有的属性(通常是类里面已经定义好的)在加上对象具有的当前属性值(这些属性往往是动态的)

王美女这个对象具有某些特征,眼睛,大;腿,长;皮肤,白。当然,既然是美女,肯定还有别的显明特征,读者可以自己假设去。如果用“对象”的术语来说明,就说这些特征都是她的属性。也就是说属性是一个对象做具有的特征,或曰:是什么。

 

方法:即行为(behavior),是指一个对象如何影响外界及被外界影响,表现为对象自身状态的改变和信息的传递。

王美女除了具有上面的特征之外,她还能做一些事情,比如她能唱歌、会吹拉弹唱等。这些都是她能够做的事情。用“对象”的术语来说,就是她的“方法”。即方法就是对象能够做什么

 

:在面向对象程式设计,类(class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。

首先要明确,类是对某一群具有同样属性和方法的对象的抽象。比如这个世界上有很多长翅膀并且会飞的生物,于是聪明的人们就将它们统一称为“鸟”——这就是一个类,虽然它也可以称作“鸟类”。

 

实例:类仅仅是对物体的抽象描述,并不是某个具体物件.。由类变成一个实例的过程叫做类的实例化。

在编程界,有这样一句话,说“类是实例工厂”,什么意思呢?工厂是干什么的?生产物品,比如生产电脑。一个工厂可以生产好多电脑。那么,类,就能“生产”好多实例,所以,它是“工厂”。

 

定义时添加

通常在定义类的时候,添加属性和方法。


  1. class Person(object): #创建类
  2. def __init__(self, name): #构造函数
  3. self.name = name

  4. def getName(self): #类中的方法(函数)
  5. return self.name

  6. def color(self, color):
  7. print "%s is %s" % (self.name, color)

  8. girl = Person('canglaoshi') #实例化
  9. name = girl.getName() #调用方法(函数)
  10. print "the person's name is: ", name
  11. girl.color("white") #调用方法(函数)

  12. print "------"
  13. print girl.name #实例的属性

__init__()是构造函数,在类实例化之后,就立即执行了这个构造函数。作为首次初始化使用。

self 类里面的函数,第一个参数是self。在类内部,就是将所有传入的数据都赋给一个变量,通常这个变量的名字是self。也就是说,self接收实例化的所有数据,self就是一个实例。

在函数外部,类的实例化对象 girl 和函数内部的slef是一回事。girl.name 相当于 slef.name

 

保存并运行

  1. $ python 20701.py
  2. the person's name is: canglaoshi
  3. canglaoshi is white
  4. ------
  5. canglaoshi

 

动态添加

 

有些情况没有在定义类是添加它的属性或者方法(比如,我们使用第三方函数库的时候)。但可以通过动态的方法,在程序执行的过程中添加。

 

动态添加属性

第一种:使用对象名.属性名添加,示例如下:

    p.age = 18


第二种:使用setattr函数添加,示例如下:

  1.  if not hasattr(p,'age'):
  2.      setattr(p,'age',18)

hasattr是用来判断一个对象是否有某个属性,而setattr是用来给某个对象添加属性,并且指定这个属性的值。

 

 

动态添加方法

 

动态添加实例方法:


使用types.MethodType这个方法了,示例代码如下:

  1. import types
  2. class Person(object):
  3.     def __init__(self,name):
  4.         self.name = name

  5. def run(self):
  6.     print('%s在奔跑' % self.name)

  7. p1 = Person('p1')
  8. p1.run = types.MethodType(run,p1)

  9. p1.run()


其中types.MethodType的第一个参数是这个函数本身,第二个参数是在调用run这个函数的时候,传给run方法的第一个参数。

 

动态添加类方法:

添加类方法,是把这个方法添加给类。因此添加类方法的时候不是给对象添加,而是给类添加。

直接将这个函数赋值给类就可以了,但是需要使用classmethod装饰器将这个方法设置为一个类方法。示例代码如下:

  1. import types

  2. class Person(object):
  3.     country = 'china'
  4.     def __init__(self,name):
  5.         self.name = name

  6. @classmethod
  7. def run(cls):
  8.     print('%s在奔跑' % cls.country)

  9. Person.run = run
  10. Person.run()


动态添加静态方法:


添加静态方法,是把这个方法添加给类。因此也是直接给类添加的,并且使用staticmethod这个装饰器。示例方法如下:

  1. import types

  2. class Person(object):
  3.     country = 'china'
  4.     def __init__(self,name):
  5.         self.name = name

  6. @staticmethod
  7. def run():
  8.     print('在奔跑')

  9. Person.run = run
  10. Person.run()

 

 

动态删除属性和方法:

  1. del 对象.属性名
  2. delattr(对象,"属性名")

 

 

__slots__限制动态添加属性或方法

示例代码如下:

  1. class Person(object):
  2.     __slots__ = ('name','age')
  3.     def __init__(self,name):
  4.         self.name = name

  5. p = Person('zhiliao')
  6. setattr(p,'height',180)

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多