`
shuofenglxy
  • 浏览: 189652 次
  • 性别: 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实现动态给类和对象添加属性和方法操作示例

    主要介绍了Python实现动态给类和对象添加属性和方法操作,涉及Python面向对象程序设计中类与对象属性、方法的动态操作相关实现技巧,需要的朋友可以参考下

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

    本文实例讲述了Python实现动态添加属性和方法操作。分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #!python3 class Person(): def __init__(self, name, age): self.name = name self.age = age p1 ...

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

    下面小编就为大家分享一篇python 类对象和实例对象动态添加方法。具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    python基础教程:Python实现动态给类和对象添加属性和方法操作示例

    本文实例讲述了Python实现动态给类和对象添加属性和方法操作。分享给大家供大家参考,具体如下: 动态给类和对象添加属性 定义一个Person类 class Person(object): def __init__(self, name): self.name = name ...

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

    python实例

    Python 2和Python 3的介绍

    Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被人们用于独立的、大型项目的开发和设计 Python解释器易于扩展,...

    python的使用方法.docx

    python的使用方法 Python是一种解释性、面向对象、动态数据类型的高级编程语言。它的语法简洁、易于理解,并且拥有丰富的库和强大的功能,因此被广泛应用于各种领域,如Web开发、数据科学、人工智能、游戏开发等等...

    在python的类中动态添加属性与生成对象

    给大家介绍了如何在python的类中动态添加属性和生成对象,文中通过几个方面来进行介绍,对这感兴趣的朋友们可以学习学习。

    老男孩第三期Python全栈开发视频教程 零基础系统学习Python开发视频+资料

    ├─(12) 02 python s3 day42 JS的window对象之定时器.avi ├─(13) 03 python s3 day42 JS的history对象和location对象.avi ├─(14) 04 python s3 day42 JS的DOM节点.avi ├─(15) 05 python s3 day42 JS的DOM节点...

    Python类及获取对象属性方法解析

    1.类外面添加对象属性 class Washer(): def wash(self): print('do some laundry stuff') haier1 = Washer() #添加属性,对象名、属性名 = 值 haier1.width = 400 haier1.height = 500 对象属性既可以在类外面...

    Python 函数参数和返回值的作用

    Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被人们用于独立的、大型项目的开发和设计 Python解释器易于扩展,...

    Python中集合对象的创建和基本运算示例

    使用环境:需要先安装PyCharm(请自己百度下载安装),以及然后官网上下载Python 2.7版本,以及Python 3.7版本后,安装在自己的电脑上。...目的:帮助理解集合对象在Python中的具体创建和基本的集合运算。

    python-创建类方法.docx

    python 创建类方法 Python是一种面向对象的编程语言,它提供了许多方便的方法来创建类和对象。其中,类方法是一种特殊的方法,它与类本身相关,而不是与类的实例相关。在本文中,我们将介绍如何使用Python创建类方法...

    PYTHON面向对象之学生管理系统!

    python面向对象之学生管理系统 话不多说,先看看代码(求关注+赞,努力写出好的东西!…_ 谢谢!!) #哪里有所不妥可以修改 #python面向对象之学生管理系统 import sys class StudentManage: student_list = [] #...

    Python的特点和面相对象基本概念

    Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。 Python解释器易于扩展,可以使用...

    尚硅谷Python核心基础

    授课老师从业经验丰富,讲课由浅入深,贴近真实开发,紧紧围绕Python核心基础知识,系统讲解操作系统、Python环境搭建、Python的基本语法、类型和对象、流程控制、函数、函数式编程、面向对象、文件操作等内容。...

    Python实验五 面向对象编程和掌握对象的应用.docx

    2) 为Student对象动态增加新属性性别sex 3) 在类外部尝试访问私有实例属性sno 4) 在类中新定义get()方法返回age的值,以及set()方法设置age的新值,age&gt;0时设置成为新值,age时,提示设置年龄不合法。 3. 水果超市,...

    Python基础课程-面向对象编程.pdf

    Python基础课程-⾯向对象编程 Python⾯向对象编程 ⾯向对象编程 在本⽂中,您将学习Python中的OOP的以下基本概念: Python类 对象实例 定义和使⽤⽅法 OOP继承 什么是⾯向对象编程( 什么是⾯向对象编程(OOP)?...

Global site tag (gtag.js) - Google Analytics