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") #刪除不了類中的類屬性