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.运行的过程中删除属性、方法

  1. del 对象.属性名
  2. 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两个方法主要用来删除绑定的实例属性和实例方法。

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

你可能感兴趣的:(python编程与爬虫开发系列,Python人工智能开发系列)