Python-动态添加属性和方法

class Person():

  Country=‘CN‘

  def __init__(self,nm)

    self.nm=nm

动态添加实例属性及实例方法:

p=Person()

p.age=18 #直接赋值,动态添加实例属性

def set_age(self,age) #定义带self变量的函数

  self.age=age

def set_nm(self,nm) #定义带self变量的函数

  self.nm=nm

from types import MethodType

p.set_age=MethodType(set_age,p) #对实例进行动态添加实例方法,仅该实例有效

Person.set_age=MethodType(set_age,Person) #对类动态添加实例方法,参数更改为类名即可,所有实例有效

Person.set_nm=set_nm #直接赋值,对类动态添加实例方法,所有实例有效

Person.sex=‘M‘ #直接赋值,动态添加类属性,所有实例有效

动态添加类方法或静态方法:

@classmethod #使用此修饰器

def cnm(cls): #使用cls作为传入的类对象

  cls.Country=‘China‘ #只对类属性操作

Person.cnm = cnm # 直接赋值即可,动态添加类方法

@staticmethod #使用静态修饰器

def snm(): #无参数

  pass

Person.snm = snm # 直接赋值,动态添加静态方法

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

class Study():

  __slots__=(‘name‘,‘age‘,)

  pass

该类中只允许动态添加name,age属性,其他属性及方法无法动态添加。

__slots__只对当前类有效,继承无效。只适用于实例属性和实例方法。

若子类中无定义__slots__则子类不受父类的限制,若子类定义,则会继承父类__slots__.

在类的__init__ 等方法中定义的属性都是动态的,都受到__slots__的限制。

在__init__ 等方法的执行过程中,定义的属性跟通过动态增加的实例属性是一样的,都是动态的。

通过增加实例方法,受到__slots__的限制,但在类的声明中通过def实现的方法是不受__slots__限制的,因为在类的声明中实现的方法是静态的。

原文地址:https://www.cnblogs.com/kang2008/p/9902860.html

时间: 2024-11-07 13:49:50

Python-动态添加属性和方法的相关文章

JS内置对象的原型不能重定义?只能动态添加属性或方法?

昨天马上就快下班了,坐在我对面的同事突然问我一个问题,我说“爱过”,哈哈,开个玩笑.情况是这样的,他发现JS的内置对象的原型好像不能通过字面量对象的形式进行覆盖, 只能动态的为内置对象的原型添加属性或方法,下面那个具体的例子说明: var arr=[]; Array.prototype={ push:function(){ alert("1"); } }; arr.push(); //没有任何输出 有人可能会说了“你先定义的arr,后来又修改了Array.prototype,这时Arr

python类对象动态添加属性和方法

class Person(): #创建一个类 def __init__(self,name): #定义初始化信息. self.name = name li = Person('李') #实例化Person('李'),给变量li li.age = 20 #再程序没有停止下,将实例属性age传入.动态语言的特点. Person.age = None #这里使用类名来创建一个属性age给类,默认值是None.Python支持的动态属性添加. def eat(self): #定义一个方法,不过这个方法再

python3 - 动态添加属性以及方法

给实例动态添加方法,需引入types模块,用其的MethodType(要绑定的方法名,实例对象)来进行绑定:给类绑定属性和方法,可以通过 实例名.方法名(属性名) = 方法名(属性值) 来进行绑定.给类添加方法,通过@classmethod:给类添加静态方法通过@staticmethod import types #定义了一个类class Person(object): num = 0 def __init__(self, name = None, age = None): self.name

iOS动态性:动态添加属性的方法——关联(e.g. 向Category添加属性)

想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative References,这个问题就很容易解决了.这种方法也就是所谓的关联(association),我们可以在runtime期间动态地添加任意多的属性,并且随时读取.所用到的两个重要runtime API是: 1 OBJC_EXPORT void objc_setAssociatedObject(id

【原】iOS中动态添加属性的方法——关联(e.g. 向Category添加成员变量)

想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative References,这个问题就很容易解决了.这种方法也就是所谓的关联(association),我们可以在runtime期间动态地添加任意多的属性,并且随时读取.所用到的两个重要runtime API是: OBJC_EXPORT void objc_setAssociatedObject(id o

python动态添加属性

class A: def __init__(self, info ={}): self.info = info def __getattr__(self, item): return self.info[item] a =A() a.age = 123 print(a.age) a.name = 123 print(a.name) a.xis = 123 print(a.xis) print(a.__dict__) 原文地址:https://www.cnblogs.com/7134g/p/115

Python 动态添加类方法

习题: 1. Shape基类,要求所有子类都必须提供面积的计算,子类有三角形.矩形.圆. 2. 上题圆类的数据可序列化 第一种方法:使用Mixin多继承组合的方式,混入其它类的属性和方法 第二种方法:使用装饰器装饰类,动态添加属性和方法 实例: import math import json import msgpack import pickle class Shape: """防止直接调用父类的area方法""" @property def

python 动态给实例添加属性和方法并使用__slots__

from types import MethodType #创建一个空类class Person(object): __slots__ = ("name", "age", "speak") per = Person()#动态添加属性,这体现了动态语言的特点(灵活)per.name = "tom"print(per.name)#动态添加方法'''def say(self): print("my name is &quo

Python3动态添加属性,删除属性,判断属性函数

动态添加属性是指在类的外面给对象动态绑定属性,添加的方法有两种:1.直接绑定到对象上,例如:p.name="Tom"2.使用setattr函数:setattr(p,'name','Tom')判断对象是否拥有某个属性:hasattr(p,'name'),返回布尔值:也可以用来判断对象是否拥有某个方法删除某个属性:del关键字:del p.namedelattr函数:delattr(p,'name') 原文地址:https://blog.51cto.com/13560219/2479011