Python 學習筆記三

2022-01-23 04:18:15 字數 3481 閱讀 3231

因為python是一門動態語言,所以無法避免的會有給乙個例項新增各種的屬性或者方法的情況,python可以使用這個來限制實力的屬性。

class student(object):

__slots__ = ('name', 'age') # 用tuple定義允許繫結的屬性名稱

但是我覺得這樣也不是很好,如果有很多屬性的話豈不是都寫一長串,而且如果有人忘寫了,還是不可避免的出現之前那種說過的情況。總而言之,語言不會去限制你怎麼寫,一切靠自覺。

看到這個的第一感覺就是類似object-c裡面的property;

只需要在屬性對應的get函式前面加上@property,則可以實現get方法;在set函式前面加上屬性.setter,則可以實現set方法;

在類定義的時候,可以在括號裡面加上多個類從而實現多繼承;

class dog(animal,friend) //狗是一種動物也是一種朋友
運算子過載意味著在類方法中攔截內建的操作-當類的例項出現在內建操作中,python自然會呼叫你的方法,比如我們一直使用的__init__

類可以過載所有python表示式運算子,像是列印、函式呼叫、屬性點號運算等內建運算

常見運算子過載方法包括以下:

像是在c++中的enum,使用方法如下:

from enum import enum

month = enum('month', ('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'))

元類就是用來建立類的東西,包括:

攔截類的建立;

修改類;

返回修改後的類;

個人覺得這是乙個黑魔法,一般專案中應該不會用到,同時使用者要很小心,而且要很清楚自己在幹嘛。

type函式除了可以幫我們獲取物件的型別,還可以幫我們建立物件,其描述為:

type(類名, 父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值))
舉個例子:

# 我們可以這麼做

class myclass(object):

bar = true

# 也可以這麼做

foo = type('foo', (), )

上面兩種方法達到的目的是一樣的,都能夠建立乙個類,但正常情況下不建議這麼使用;

除了使用type可以動態的建立類意外,還可以使用metaclass

class foo(object):

__metaclass__ = dosomething

如果這麼做的話,python就不會使用內建的type來建立這個類,而是使用你自己定義的元類來建立,python會做這麼乙個操作:

首先寫下class foo(object),但是類物件foo還沒有在記憶體中建立。python會在類的定義中尋找__metaclass__屬性,如果找到了,python就會用它來建立類foo,如果沒有找到,就會用內建的type來建立這個類。

例子:

# 請記住,'type'實際上是乙個類,就像'str'和'int'一樣

# 所以,你可以從type繼承

class upperattrmetaclass(type):

# __new__ 是在__init__之前被呼叫的特殊方法

# __new__是用來建立物件並返回之的方法

# 而__init__只是用來將傳入的引數初始化給物件

# 你很少用到__new__,除非你希望能夠控制物件的建立

# 這裡,建立的物件是類,我們希望能夠自定義它,所以我們這裡改寫__new__

# 如果你希望的話,你也可以在__init__中做些事情

# 還有一些高階的用法會涉及到改寫__call__特殊方法,但是我們這裡不用

def __new__(upperattr_metaclass, future_class_name, future_class_parents, future_class_attr):

attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))

uppercase_attr = dict((name.upper(), value) for name, value in attrs)

return super(upperattrmetaclass, upperattr_metaclass).__new__(upperattr_metaclass, future_class_name, future_class_parents, uppercase_attr)

class foo(object):

def echo_bar(self):

print(self.bar)

myclass = upperattrmetaclass('foochild', (foo,), {})

my = myclass()

類似於c++中的try...catch,python也有類似的錯誤處理函式:

try...

except: division by zero

finally...

例子:

try:

print('try...')

r = 10 / int('a')

print('result:', r)

except valueerror as e:

print('valueerror:', e)

except zerodivisionerror as e:

print('zerodivisionerror:', e)

finally:

print('finally...')

print('end')

你還可以使用內建的logging來紀錄錯誤資訊:

import logging

def main():

try:

bar('0')

except exception as e:

logging.exception(e)

到這裡,我覺得最基本的語法已經學完了,接下來的包括:

這些程式設計都是用到的時候再來查詢總結。

python學習筆記(三)

python的序列 列表,元組,字串都是列表,列表的主要特點是索引和切片操作 序列的基本操作 1.len 求序列的長度 2.連線兩個序列 3.重複序列元素 4.in判斷序列是否在元組中 5.max 返回最大值 6.min 返回最小值 7.cmp tup1,tup2 比較兩個序列的值 元組 元組和字串...

python學習筆記三

一 輸出 print的幾種用法 print hello world hello world中間有空格 print hello wolrd helloworld 中間沒有空格 print hello wolrd helloworld 中間沒有空格 print hello world hello wor...

python學習筆記(三)

list也可以直接做加法 a 1,2 a 3 a 1,2,3 lambda用來定義匿名函式 lambda x x 2.0 lambda x x 2.0 平方是用 student torture不理解 for可以各種巢狀 ppl alice bob carol doug excited ppl e f...