python 面向对象六 动态添加方法 __slots__限制动态添加方法

一、动态添加属性

1 >>> class Student(object):
2     pass
3
4 >>> st = Student()
5 >>> st.name = ‘Jack‘
6 >>> st.name
7 ‘Jack‘

二、动态给实例添加方法

 1 >>> from types import MethodType
 2 >>> class Student(object):
 3     pass
 4
 5 >>> def set_age(self, age):
 6     self.age = age
 7
 8 >>> st.set_age = MethodType(set_age, st)   # 给实例绑定一个方法
 9 >>> st.set_age(25)
10 >>> st.age
11 25

三、动态给类添加方法

 1 >>> class Student(object):
 2     pass
 3
 4 >>> def set_score(self, score):
 5     self.score = score
 6
 7 >>> Student.set_score = set_score
 8 >>> s1 = Student()
 9 >>> s1.set_score(100)
10 >>> s1.score
11 100
12 >>> s2 = Student()
13 >>> s2.set_score(50)
14 >>> s2.score
15 50

四、限制实例的属性 __slots__

 1 >>> class Student(object):
 2     __slots__ = (‘name‘, ‘age‘)   # 用tuple定义允许绑定对的属性名称
 3
 4 >>> s = Student()
 5 >>> s.name = ‘Jack‘
 6 >>> s.age = 20
 7 >>> s.score = 100
 8 Traceback (most recent call last):
 9   File "<pyshell#53>", line 1, in <module>
10     s.score = 100
11 AttributeError: ‘Student‘ object has no attribute ‘score‘

__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

1 >>> class GraduateStudent(Student):
2 ...     pass
3 ...
4 >>> g = GraduateStudent()
5 >>> g.score = 9999

除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__:

 1 >>> class GraduateStudent(Student):
 2     __slots__ = (‘score‘, )
 3
 4 >>> g = GraduateStudent()
 5 >>> g.score = 100
 6 >>> g.name = ‘Mike‘
 7 >>> g.age = 10
 8 >>> g.other = ‘abc‘
 9 Traceback (most recent call last):
10   File "<pyshell#69>", line 1, in <module>
11     g.other = ‘abc‘
12 AttributeError: ‘GraduateStudent‘ object has no attribute ‘other‘
时间: 2024-08-24 19:03:33

python 面向对象六 动态添加方法 __slots__限制动态添加方法的相关文章

python 面向对象(成员,静态,类)的(变量,方法)区别

静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者访问类方法或变量(通过类名.方法名或变量名) 类方法使用@classmethod来装饰,参数表中不需要self,但需要cls参数和当前类关联.不能访问成员变量和方法,但是可以通过cls.xxx访问类方法或类变量 一下是参考了网上的一些大神的总结: 静态成员方法: 不能访问类属性,实例属性,相当于一个

Python 面向对象编程基础——初始化实例、类属性、方法

#1.初始化实例化属性.#可接受任意关键字参数,并把他们都作为属性赋值给实例.使用**kw,除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过setattr(self, 'name', 'xxx')设置属性.class Person(object):    def __init__(self, name, gender, **kw):        self.name = name        self.gender = gender        for k,v i

python 面向对象六 类属性和实例属性

一.实例属性 Python是动态语言,根据类创建的实例可以任意绑定属性. 1 >>> class Student(object): 2 ... def __init__(self, name): 3 ... self.name = name # 每个实例必须的属性 4 ... 5 >>> s = Student('Jack') 6 >>> s.score = 90 # 任意绑定属性 7 >>> s.name 8 'Jack' 9 &g

Python(六)面向对象

本章内容: 创建类和对象 面向对象三大特性(封装.继承.多态) 类的成员(字段.方法.属性) 类成员的修饰符(公有.私有) 类的特殊成员 创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用. 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数 class是关键字,表示类 创建对象,类名称后加括号即可 # 创建类 class

Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法

一.Python面向对象中的新旧式类 1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object).在python3.x中若没有指定父类,会默认使用的是object作为基类:在python2.x中,若没指定父类,则不会以object作为基类. 2)旧式类(经典类):在定义类时,类后边括号中不用继承object类,甚至不用括号. 3)dir方法是用来查看类的内置方法. 二.私有方法和属性 1)私有属性是对象不希望公开的属性:私有方法是对象不希望公开的方法.在定义私有属性和方法时,在属

十六、python面向对象基础篇

面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程范式,面向过程,面向对象,面向切面(装饰器部分)等 -------------------------------------------------------------------- -------------------------------------------------------

runtime 方法替换 和 动态添加类方法 结合使用

原文地址:runtime 方法替换 和 动态添加类方法 结合使用 前言:方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法. 缺陷:1.含参数的方法难以处理,参数值需要根据实际业务逻辑而定.2.无法实现动态添加实例方法. Create Person.h and Person.m Person.h: 12345 #import <Foundation/Foundation.h> @int

Runtime 方法替换 和 动态添加实例方法 结合使用

前言:方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法,这个方法可以是类方法也可以是实例方法,这个外部类也可以是没有任何方法声明和实现的类. 主要思路:使用运行时的方法替换将在外部类将自定义方法hy_resolveInstanceMethod或hy_resolveClassMethod(用hy_前缀表示是我自定义的方法)和需要被添加的类中的resolveInstanceMethod或者

jquery无法为动态生成的元素添加点击事件的解决方法

遇到 jquery无法为动态生成的元素添加点击事件,谷歌一下,整理一下解决方法如下: (<li>中间的元素是动态生成的), 现在想为<i>添加点击事件, 例子如下: <div> <ul> <li> <span> <i class='icon'>这是元素内容</i> //i是动态生成 </span> </li> </ul> </div> 解决方法如下: $(docu