1. 程式人生 > >小甲魚python疑難點

小甲魚python疑難點

turn 代碼 cap 發生 註意 enter 綁定 自己 類對象

1.python生成器

2.while 1:

num = input(‘請輸入一個整數(輸入Q結束程序):‘)

if num != ‘Q‘:

num = int(num)

print(‘十進制 -> 十六進制 : %d -> 0x%x‘ % (num, num))

print(‘十進制 -> 八進制 : %d -> 0o%o‘ % (num, num))

print(‘十進制 -> 二進制 : %d -> ‘ % num, bin(num))

else:

break

十進制到二進制怎麽實現的

3.

技術分享圖片

當時的解釋:大佬說-->比如說函數計算的值在函數外面要用,那麽必須加return

4.

技術分享圖片

技術分享圖片

技術分享圖片

大佬解釋return語句[表達式]退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。不帶return就默認返回None。帶return就是就返回return後面的表達式。None是不能做賦值右值的。單單的funY只是一個函數對象,因為funY後面有個(),就代表funY被調用的。

我的理解return的時候表示調用該函數並返回該函數一個值,沒有return的時候只是起到調用這個函數,返回的值是默認的none。都有結束函數的意思。

*dir(classname)查看類中有哪些東西
dir(instance)查看實例中有哪些東西
__dict__查看有哪些屬性
id()查看哪些屬性一樣
我通過一系列測試得出結論:
類中的所有東西都“復制”實例中了包括類函數,靜態函數,類變量,其實能通過實例調用相同名字的類變量
instance__class__.value
另外self是用來進行綁定用的,這點可以通過直接打印函數名能夠看到哪個類的對象被綁定
另外還有繼承,也可以用上述方法研究看看這些父類子類中到底有哪些東西:其實父類中所有的東西也都復制到子類中了,正是有了顯示綁定才能方便的用子類實例調用父類的方法:應為子類實例綁定了父類函數


說到底,都是python的設計哲學比較好,能夠用一些方法清楚的看到所有的東西,比起java來說迷迷糊糊的只能看資料了解哪些類中有什麽東西,繼承時,創建實例時發生了什麽改變。

* Python裏面類之間的關系可以是縱向關系,采用繼承機制可以將基類裏面的屬性和方法全部被子類使用,而父類卻不可以使用子類的方法和屬性,例如魚和鯊魚、鯉魚三文魚之間的關系等;當然類之間也可以是橫向關系,可以通過實例化一個類的對象來作為另一類的屬性來實現類之間的調用關系,例如池塘和池塘內的魚和烏龜之間的關系等,舉例說明:
>>> class Turtle:
def __init__(self,x):
self.x = x
>>> class Fish:
def __init__(self,y):
self.y = y
>>> class Pool:
def __init__(self,x,y):
self.turtle = Turtle(x) #將Turtle類實例化的對象turtle作為類Pool實例化對象的屬性
self.fish = Fish(y) #將Fish類實例化的對象fish作為類Pool實例化對象的屬性
def printnum(self):
print(‘池塘內的烏龜有%d 只,小魚有 %d 條!‘ %(self.turtle.x,self.fish.y))
>>> pool = Pool(2,10)
>>> pool.printnum()
池塘內的烏龜有 2 只,小魚有 10 條!

*、

技術分享圖片

解釋:

技術分享圖片

技術分享圖片

技術分享圖片

解釋:表示false,但不等於false

*修飾符(裝飾器)

*小甲魚:class CapStr(str): -----

def __new__(cls,string):

string=string.upper()

return str.__new__(cls,string)

錯誤: class CapStr(str):

def __new__(cls,string):

string=string.upper()

return str.__new__(cls,string)

def __init(self,string):

self.x=string

cs=CapStr(‘I love You‘)

cs.x

解釋:小甲魚這裏只是舉例說明__new__(cls)這個特殊方法的用法。在視頻和書中都明確說明了絕大多數情況都不需要去改寫這個特殊方法的。只有當類繼承自另一個不可變類的時候才需要去改寫。
1、class CapStr(str)請註意,這個類繼承自 str 類;
2、因此如果你不重寫__new__方法的話,任何字符串都沒有辦法在__init__方法中實現首字母大寫的初始化操作;
3、改寫完成後必須將改動提交給父類的__new__方法來實現返回,例題中是用: str().__new__(cls, string)來實現的,但是一般最好用super函數來避免菱形繼承。

至於你的第二段代碼不能實現有兩個地方理解有誤:
1、__init__少了兩個下劃線;
2、__new__是用來初始化類,__init__是用來初始化類對象;所以__init__裏面的self.x屬性是cs的,也就是最初傳遞進去的I Love You字符串,所以你輸出還是原來的樣子。
3、只需要輸入 cs 並回車就可以看到全部大寫後的字符串,這是因為實例化對象 cs 的時候__new__方法除了 cls 參數以外,其他參數都會傳遞給__init__方法,所以不需要你再寫一次了。所有有沒有你寫的__init__都不影響。

你看下圖我的運行結果,第一個是有 __init__的,第二個是沒有__init__的。你也可以試試!

技術分享圖片

技術分享圖片

*__metaclass__=type

class CapString(str):

def __new__(cls,string):

string=string.upper()

return str.__new__(cls,string)

class CapString(str):

def __new__(cls,string):

return string.upper()

解釋:return string.upper() 是把計算好的結果 自己返回
return str.__new__(cls,string) 是把結果交給父類str處理返回(這樣是為是防止不必要的錯誤發生)
再看看__new__的說明
1. __new__ 是在一個對象實例化的時候所調用的第一個方法
2. 它的第一個參數是這個類,其他的參數是用來直接傳遞給 __init__ 方法
3. __new__ 決定是否要使用該 __init__ 方法,因為 __new__ 可以調用其他類的構造方法或者直接返回別的實例對象來作為本類的實例,如果 __new__ 沒有返回實例對象,則 __init__ 不會被調用
4. __new__ 主要是用於繼承一個不可變的類型比如一個 tuple 或者 string

*

技術分享圖片

技術分享圖片

*

技術分享圖片

*怎麽在shell裏改name

技術分享圖片

技術分享圖片 技術分享圖片

解釋:類Record()的實例對象沒有返回值,這樣子寫的話x是屬於類的屬性,在創建的時候就已經被賦值了,賦的值就是那個返回值。技術分享圖片

也就是這個樣子,這個x已經是‘你好‘了,然而‘你好‘是沒有 name 這個屬性的,技術分享圖片

初始化的話這個x指向的是類Record() 這時候的self.x是一個類Record()的實例對象,所以有 name 這個屬性。

*

技術分享圖片

解釋:淺拷貝,淺拷貝只拷貝父對象,不拷貝裏面的子對象。

http://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

*

技術分享圖片

解釋: ip==119.113.112.332

*

技術分享圖片

解釋:表達式裏面有幾組括號?只有一組。+號在括號外面。括號最多匹配到一個字符,要麽是a, 要麽是cre 在單次搜索中如果命中多個分組,自保留最後的分組。他其實是匹配了abc,但是c是最後匹配的,又因為只能匹配一個字符,c又把前面的覆蓋了,所以為c

擴展:

技術分享圖片 技術分享圖片

m.group() == m.group(0) 這個返回的是整個匹配的字符串"abc"

小甲魚python疑難點