因為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...