`
shuofenglxy
  • 浏览: 195303 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python之动态增加对象方法

阅读更多

python3.1想要动态增加方法需要先Import types

 

import types
class Demo:
    def hello(self):
        print("hello world")

helloInstance = Demo()
def hello2(self):
    print ("hello again")
Demo.hello2 =hello2         #为该类定义hello2方法
helloInstance.hello()
helloInstance.hello2()

def hello3(self):
    print ("hello once more")
helloInstance2 = Demo()
helloInstance2.hello()
helloInstance2.hello2()
helloInstance2.hello3 =hello3   #只为这个实例定义hello3方法
helloInstance2.hello3(helloInstance2)

helloInstance4 = Demo()
helloInstance4.hello()
helloInstance4.hello2()
helloInstance4.hello3(helloInstance4)

 

 

执行结果如下:

 

hello world
hello again
hello world
hello again
hello once more
hello world
hello again
Traceback (most recent call last):
  File "C:/Python31/hello2", line 24, in <module>
    helloInstance4.hello3(helloInstance4)
AttributeError: 'Demo' object has no attribute 'hello3'

 

结果分析:可以发现,为该类定义了hello2后,所有后面生成的实例都能调用该方法;而专为第三个实例定义的hello3方法,则不能被第四个实例调用。从这里可以看到python动态生成的强大,可以为类 或者一个具体实例定义一个方法并使用。

 

Ps:python3.0之后,new被types取代了。所以 import new将会报 ImportError: No module named new错误

0
3
分享到:
评论
9 楼 mirguest 2011-03-05  
不会的啊。你看看我的例子,就是用3.2写的啊。
我的意思可能你不理解。
就是,如果对一个实例进行绑定方法,那么给定的函数,可以省去self。
但如果是对类绑定,那么就要加上去。
8 楼 shuofenglxy 2011-03-04  
mirguest 写道
shuofenglxy 写道
mirguest 写道
另外,我觉得,像您这样调用函数,不觉得别扭吗?
helloInstance2.hello3(helloInstance2) 

呵呵    那个java的习惯  里面传对象 是因为不传会报错  呵呵

其实,那个self是可以省掉的。因为你要把这个函数直接绑定给一个实例,而非一个类。
如果是类,那个self大概是必须的。

其实这个东西吧 3.1跟以前变化有点大  我直接搞得3.1 如果不带实例语法上都通不过的
7 楼 mirguest 2011-03-04  
shuofenglxy 写道
mirguest 写道
另外,我觉得,像您这样调用函数,不觉得别扭吗?
helloInstance2.hello3(helloInstance2) 

呵呵    那个java的习惯  里面传对象 是因为不传会报错  呵呵

其实,那个self是可以省掉的。因为你要把这个函数直接绑定给一个实例,而非一个类。
如果是类,那个self大概是必须的。
6 楼 mirguest 2011-03-04  
实在太好奇,所以就编译了下3.2的。
然后就试了试,发现还是一样的啊。
$ ./python3
Python 3.2 (r32:88445, Mar  4 2011, 21:19:27) 
[GCC 3.4.6 20060404 (Red Hat 3.4.6-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Demo:
...     def hello(self):
...         print("hello 1")
... 
>>> h1=Demo()
>>> type(Demo)
<class 'type'>
>>> type(h1)
<class '__main__.Demo'>
>>> h1.hello()
hello 1
>>> def h2():
...     print("hello 2")
... 
>>> h1.hello2=h2
>>> h1.hello2()
hello 2
>>> 
5 楼 shuofenglxy 2011-03-04  
mirguest 写道
另外,我觉得,像您这样调用函数,不觉得别扭吗?
helloInstance2.hello3(helloInstance2) 

呵呵    那个java的习惯  里面传对象 是因为不传会报错  呵呵
4 楼 mirguest 2011-03-04  
另外,我觉得,像您这样调用函数,不觉得别扭吗?
helloInstance2.hello3(helloInstance2) 
3 楼 mirguest 2011-03-04  
shuofenglxy 写道
mirguest 写道
lz,看了你这篇文章,但我没有发现你使用了types啊。
另外,这个应该是和python类和实例中对方法的搜寻机制有关,
我看过python in a nutshell有提及,但我不是太懂。
你如果是对类进行绑定方法,那么此类就多了这个方法。

另外,对于实例的绑定,其实python会自动帮你加上self,所以无需加self。
>>> class Demo(object):
	def hello(self):
		print "hello"
>>> x=Demo()
>>> def hello2():
	print "hello2"
	
>>> x.hello2=hello2
>>> x.hello2()
hello2
>>> 

呵呵 你去掉import 试试

同样 你去掉self试试  这些都是3.1下测试通过的 你会发现一些没想到的东西  python语言一直在调整  呵呵


lz,由于我没有3.X,麻烦你贴出代码给我看看。
看看错误是如何的。
2 楼 shuofenglxy 2011-03-04  
mirguest 写道
lz,看了你这篇文章,但我没有发现你使用了types啊。
另外,这个应该是和python类和实例中对方法的搜寻机制有关,
我看过python in a nutshell有提及,但我不是太懂。
你如果是对类进行绑定方法,那么此类就多了这个方法。

另外,对于实例的绑定,其实python会自动帮你加上self,所以无需加self。
>>> class Demo(object):
	def hello(self):
		print "hello"
>>> x=Demo()
>>> def hello2():
	print "hello2"
	
>>> x.hello2=hello2
>>> x.hello2()
hello2
>>> 

呵呵 你去掉import 试试

同样 你去掉self试试  这些都是3.1下测试通过的 你会发现一些没想到的东西  python语言一直在调整  呵呵
1 楼 mirguest 2011-03-04  
lz,看了你这篇文章,但我没有发现你使用了types啊。
另外,这个应该是和python类和实例中对方法的搜寻机制有关,
我看过python in a nutshell有提及,但我不是太懂。
你如果是对类进行绑定方法,那么此类就多了这个方法。

另外,对于实例的绑定,其实python会自动帮你加上self,所以无需加self。
>>> class Demo(object):
	def hello(self):
		print "hello"
>>> x=Demo()
>>> def hello2():
	print "hello2"
	
>>> x.hello2=hello2
>>> x.hello2()
hello2
>>> 

相关推荐

    Python伪装文件类对象输入输出重定向方法研究.pdf

    综上所述,本研究提出的Python伪装文件类对象输入输出重定向方法,是在深入理解Python动态特性和操作系统输入输出重定向机制的基础上,针对自动测评中遇到的特定问题而提出的解决方案。这种方案在提高评测效率、减少...

    python面向对象课件

    面向对象编程(Object-Oriented Programming,简称OOP)是Python编程中的核心概念之一,它是一种编程范式,强调通过创建对象来组织代码,使得程序更易于理解和维护。本课件详细介绍了Python中的面向对象特性,包括类...

    python面向对象

    在Python中,面向对象编程是其核心特性之一,允许开发者创建复杂、可维护的代码结构。 在Python中,面向对象有三大基本概念:类(Class)、对象(Object)和继承(Inheritance)。首先,类是对象的蓝图,定义了一组...

    python面向对象练习题.pdf

    在Python中,可以通过定义特殊的方法来控制对对象属性的访问。例如,可以定义`__getitem__`、`__setitem__`和`__delitem__`等方法来实现类似字典的操作。 **示例代码:** ```python class A(object): def __...

    Python的类型和对象

    元类可以用来在类定义时修改类的行为,如动态添加方法或者改变属性的行为。 在Python 2.x和3.x之间,对象模型有一些细微的变化,但基本概念保持一致。例如,Python 3.x中所有类都自动继承自`abc.ABCMeta`,这是一个...

    面向对象编程基础_python面向对象_python教程_

    在Python中,面向对象编程是其核心特性之一,使得Python成为了一种非常适合进行复杂系统开发的语言。下面我们将深入探讨Python中的面向对象编程基础。 一、类与对象 1. **类(Class)**:类是面向对象编程的基础,...

    Python 3面向对象编程

    面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它基于“对象”的概念,将数据和处理这些数据的方法封装在一起。在Python 3中,面向对象编程是其强大功能的一部分,使得代码更加模块化...

    python案例面向对象、文件版学生管理系统

    - **类(Class)**: 在Python中,类是创建对象的蓝图,它定义了一组属性(如变量)和方法(如函数)。在这个案例中,可能会有一个名为`Student`的类,用来表示学生实体,包含姓名、学号、成绩等属性。 - **对象...

    在.Net6中调用IronPython实现动态执行脚本

    在.NET 6中调用IronPython来实现动态执行脚本是一项强大的功能,它允许程序员在运行时编写和执行Python代码,极大地增强了应用的灵活性。IronPython是一个开源的Python实现,它能够无缝集成到.NET环境中,使得.NET...

    Python计划. 面向对象语法精讲面.向对象基础模式.pdf

    面向对象编程(Object-Oriented Programming,简称OOP)是Python编程中的核心概念之一,它是一种结构化编程方式,强调通过创建对象来组织代码,提高代码的可读性、复用性和维护性。在Python中,面向对象主要涉及三个...

    Python实现动态给类和对象添加属性和方法操作示例

    ### Python 实现动态给类和对象添加属性和方法操作示例 #### 一、引言 在 Python 面向对象编程中,我们经常会遇到需要动态地为类或对象添加属性和方法的情况。这种灵活性是 Python 作为一种动态类型语言的重要特征...

    Python类型和对象.pdf

    Python 类型和对象 本文将详细介绍 Python 中的类型和对象,探讨新式对象(new-style)和用户定义的类及实例之间的关系,以及它们与内置类型的关系。 基本概念 在 Python 中,每个对象都是一个实体的体现,可以...

    python-类-对象-方法.docx

    Python 类和对象是其面向对象编程的核心组成部分,而方法则是实现类功能的关键工具。下面将详细解释这些概念。 首先,Python 类是一种用户自定义的数据结构,它允许我们封装数据和功能。类通过 `class` 关键字定义...

    Python面向对象详细教程

    根据给定的信息,本文将详细解析面向对象编程在Python中的应用与实现,涵盖Python的基本特性、类的创建、访问限制、继承与多态的概念及其应用、动态语言与静态语言的区别,以及如何获取对象信息等内容。 ### 一、...

    python 类对象和实例对象动态添加方法(分享)

    总结来说,Python 允许我们在运行时为类对象和实例对象动态添加方法,增强了代码的灵活性。通过 `types.MethodType` 可以为实例对象绑定方法,而 `staticmethod` 和 `classmethod` 则用于为类对象添加静态方法和类...

    Python-Python中的嵌套对象模型支持字典YAML和JSON转换

    Python的内置`json`模块提供了方便的方法来处理JSON数据。`json.loads()`用于将JSON字符串解析为Python对象(包括字典),而`json.dumps()`则将Python对象转换为JSON字符串。例如: ```python import json data = ...

    python面向对象版学员管理系统.pdf

    根据提供的文件信息,这篇文档似乎是一份关于Python编程语言中面向对象编程的学员管理系统的教程。文件标题为"python面向对象版学员管理系统.pdf",表明该教程将重点介绍如何利用Python的面向对象编程范式来构建一个...

    python面向对象学习总结.pdf

    例如`addCount`方法可以增加`count`的值,属于实例方法。 4. 类属性和类方法(Class Attributes and Class Methods): 类属性是属于类本身的属性,所有实例共享这个属性。类方法是用`@classmethod`装饰器声明的...

    通过Cpython3.9源码分析下,为什么说python中一切皆对象

    接下来,Python提供了一套统一的对象操作宏和函数,比如`Py_INCREF`和`Py_DECREF`用于增加和减少对象的引用计数,确保对象生命周期的正确管理;`Py_TYPE`用于获取对象的类型信息。这些通用操作确保了不同类型对象的...

Global site tag (gtag.js) - Google Analytics