动态绑定方法与 __slots__

Python属于动态语言,可以在类定义之外为实例新增属性与方法。

class Master(object):
    def printstudent(self):
        print(‘100 fen‘)
s=Master()
def setage(self,age):
    self.age=age
from types import MethodType
s.setage=MethodType(setage,s)
s.setage(25)
print(s.age)

步骤为新建实例,然后定义需要新增的方法,引入MethodType函数,MethodType函数的原型为method(function, instance)  

|  __func__
 |      the function (or other callable) implementing a method
 |
 |  __self__
 |      the instance to which a method is bound

MethodType把函数绑定到实例中,然后在实例s中新建一个link指向该函数。该函数只对s实例起作用,若用同一个类实例化s1,则s1没有该函数。

为了能给所有实例都使用该函数,可以给类绑定该函数。

s=Master()def setage(self,age):    self.age=agefrom types import MethodTypeMaster.setage=setages.setage(25)print(s.age)

__slots__的作用在于限制类的实例能添加的属性,只要__slots__没有包含的属性,实例中禁止动态添加。  

class Student(object):
    __slots__=(‘__name‘,‘__score‘)
    def __init__(self, name, score):
        self.__name = name
        self.__score = score
s=Student(‘kimi‘,90)
s.x=9999#报错,提示Student没有x属性
print(s.x)

__slots__作用仅限于类自身,不影响子类,但是如果子类也定义了__slots__,那么子类的范围就包括了子类自身限制与基类限制的并集  

  

时间: 2024-11-04 07:17:53

动态绑定方法与 __slots__的相关文章

PHP5多态性与动态绑定方法

PHP5多态性与动态绑定方法    多态性是继数据抽象和继承后,面向对象语言的第三个特征.从字面上理解,多态的意思是"多种形态",简单来说,多态是具有表现多种形态的能力的特征,在OO中是指"语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式"的能力.多态被认为是面向对象语言的必备特性. 例如: 创建一个接口 Shape,定义一个空的方法 draw(),那么所有的实现类都必须实现这个方法,假设 Shape 有两个实现类:Triangle 和 Rec

python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 1 与类和实例无绑定关系的function都属于函数(function): 2 与类和实例有绑定关系的function都属于方法(method). “与类和实例无绑定关系”就道出了其中的关键 我们知道python是动态的编程语言,python的类除了可以预先定义好外,还可以在执行过程中,动态地将函数绑定到类上,绑定成功后,那些函数就变成类的方法了. 定义User类 可以使用__slots__来限制绑定的属性和方法 1 user

Python类中的魔法方法之 __slots__

在类中每次实例化一个对象都会生产一个字典来保存一个对象的所有的实例属性,这样非常的有用处,可以使我们任意的去设置新的属性. 每次实例化一个对象python都会分配一个固定大小内存的字典来保存属性,如果对象很多的情况下会浪费内存空间. 可通过__slots__方法告诉python不要使用字典,而且只给一个固定集合的属性分配空间 class Foo(object): __slots__ = ("x","y","z") def __init__(sel

Python day 9(1) 对实例动态绑定属性和方法

一:未使用slots方法(都是在class定义完之后在class外部添加的): (1)动态绑定属性 class Student(object):           pass        >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print(s.name) Michael(2)动态绑定方法 >>> def set_age(self, age): # 定义一个

java中的动态绑定与静态绑定

首先是方法的参数是父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google的过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出了静态绑定   程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定   静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C. 针对java简单的可以理解为程序

DropdownList绑定的两种方法

动态绑定方法一:动态绑定数据库中的字段. SqlConnection conn = UtilitySqlClass.OperateDataBase.ReturnConn();string strSQL = "select * from CompanyType";SqlDataAdapter ada = new SqlDataAdapter(strSQL, conn);DataSet ds = new DataSet();ada.Fill(ds, "CompanyType&qu

Java静态绑定和动态绑定

程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定(早绑定 编译器绑定): 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C .针对java可以理解为程序编译期的绑定:特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定(迟绑定 运行期绑定): 后期绑定:在运行时根据具体对象的类型进行绑定. 若一种语言实现了后期绑定

java 动态绑定

之前看数据结构事经常会遇到:List list = new LinkedList()这样的向上转型,就研究了一下向上转型(之前只知道怎么用向上转型,但是不知道为什么向上转型,在我另外一篇博客里介绍http://www.cnblogs.com/buptldf/p/4959480.html 其中又看到关于动态绑定的概念,所以又专门看了一下. 程序绑定:调用方法时方法名与方法实体关联的过程.对于java有静态绑定和动态绑定,也有说前期和后期绑定的. 静态绑定: 在程序编译时就被绑定且被加载进内存等待被

Java——动态绑定和多态

动态绑定是在执行期间(而不是编译期间)判断所用对象的实际类型,根据其实际的类型调用其相应的方法(确定选择哪个多态形式被调用). 首先是方法的参数是父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google的过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出了静态绑定   程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后