python方法的动态性_Python语言的动态性:运行时动态绑定,删除属性和方法

Python是动态语言,动态语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。具体关于动态语言,静态语言,解释语言,编译语言的区别参考博客:编译型语言、解释型语言、静态类型语言、动态类型语言等说法的区别与联系

1.给对象在运行中添加实例属性和类属性

class Book(object):

def __init__(self,name,page):

self.name = name

self.page = page

def showInfoself(self):

print("book info:{0},{1}".format(self.name,self.page))

定义一个普通方法,一个类方法

def bkContent(self):

print("this %s's content is ............."%self.name)

@classmethod

def Content(cls):

print("this is class methon")

1.给对象在运行中添加属性

book1 = Book("平凡的世界",1000)

book1.writer = "路遥" #在程序运行时给对象添加属性,这就是动态给实例绑定属性!

print(book1.name,book1.page,book1.writer) #平凡的世界 1000 路遥

2.给类在运行中添加类属性

Book.kinds = "魔幻小说" #运行时给类添加类属性

book2 = Book("西游记",389)

print(book2.name,book2.page,book2.kinds) #西游记 389 魔幻小说

print(Book.kinds) #魔幻小说

总结:给运行中对象和运行中类添加属性,直接添加即可: 类名.属性名=属性值,实例名.属性名=属性值

2.给运行中的类添加类方法,静态方法

import types

class Book(object):

def __init__(self,name,page):

self.name = name

self.page = page

def showInfoself(self):

print("book info:{0},{1}".format(self.name,self.page))

#定义一个个普通方法,注意方法的参数是self.

def bkContent(self):

print("this %s's content is ............."%self.name)

#定义一个类方法

@classmethod

def C_Content(cls):

print("这是类方法")

#定义一个静态方法

@staticmethod

def S_Content():

print("这是静态方法")

#定义一个无参的普通方法

def o_Content():

print("这是普通无参方法")

1.给对象在运行中添加方法:使用types中的MethodType方法,先导包import types

book3 = Book("小时代",555)

#boo3.bkContent=bkContent 这种方式不行

book3.bkContent = types.MethodType(bkContent,book3) #里面的参数是方法名,对象名

book3.bkContent() #this 小时代's content is .............

a = types.MethodType(bkContent,book3)

a() #this 小时代's content is .............

book3.a = types.MethodType(bkContent,book3) #注意前面的引用名,可以自定义,但是与调用名要一致

book3.a() #this 小时代's content is .............

2.给运行中的类进行绑定类方法

Book.C_Content=C_Content

Book.C_Content() #这是类方法

book4 = Book("红楼梦",1113)

book4.C_Content() #实例调用类方法:这是类方法

3.给运行中类绑定静态方法

book5 = Book("水浒传",222)

Book.S_Content=S_Content

Book.S_Content() #这是静态方法

book5.C_Content() #这是类方法

4.给运行中的类绑定普通方法,会出错,实际也不会这样绑定。

Book.o_Content = o_Content

Book.o_Content() #没有报错:这是普通无参方法

book6 = Book("一地鸡毛",211)

book6.o_Content() #报错o_Content() takes 0 positional arguments but 1 was given

#但是对象不能直接调用类绑定的普通方法,因为类中方法都会把对象本身当做参数传给函数。

3.运行的过程中删除属性、方法

del 对象.属性名

delattr(对象, "属性名") 注意属性名用引号引起

import types

class Book(object):

country = "china"

def __init__(self,name,page):

self.name = name

self.page = page

def showInfoself(self):

print("book info:{0},{1}".format(self.name,self.page))

def p(self):

print("111")

#定义一个个普通方法,注意方法的参数是self.

def bkContent(self):

print("this %s's content is ............."%self.name)

#定义一个类方法

@classmethod

def C_Content(cls):

print("这是类方法")

#定义一个静态方法

@staticmethod

def S_Content():

print("这是静态方法")

Book.C_Content=C_Content #给类绑定一个方法

book3 = Book("小时代",555)

book3.bkContent = types.MethodType(bkContent,book3)

del book3.bkContent #删除绑定的实例方法

#book3.bkContent() 删除后调用失败,成功

#del book3.p # 删除类自带的方法,报错:AttributeError

book3.C_Content()

#del book3.C_Content #类绑定的方法也删除不了:AttributeError: C_Content

book3.price = 13

print(book3.price) #13

delattr(book3,"price") #删除实例的属性

#print(book3.price) 删除后,调用失败

print(book3.name)

delattr(book3,"name")#可以删除类中带的普通属性

print(book3.country)

delattr(book3,"country") #删除不了类中的类属性

总结:注意:del 和delattr功能有限,都是针对实例对象而言的,对于类方法,类属性则删除不了。因为del和delattr两个方法主要用来删除绑定的实例属性和实例方法。

统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值