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兩個方法主要用來刪除綁定的實例屬性和實例方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章