本系列內(nèi)容來源于 廖雪峰的Python教程 點擊查看原文
面向?qū)ο?/p>
訪問限制
class Message:
def __init__(self, id, content):
self._id = id;
self._content = content;
變量名以 __開頭 如__id 展东。都是私有變量,外部一般不能訪問
繼承,多態(tài)請自行查看
獲取對象信息
>>> type(123)
<class 'int'>
>>> type('str')
<class 'str'>
>>> type(None)
<type(None) 'NoneType'>
>>> type(123)==type(456)
True
>>> type(123)==int
True
>>> type('abc')==type('123')
True
>>> type('abc')==str
True
>>> type('abc')==type(123)
False
對于class的繼承關(guān)系來說,使用type()就很不方便巷嚣。我們要判斷class的類型柄沮,可以使用isinstance()函數(shù)。
列出和操作對象的狀態(tài)
class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject()
列出:
>>> dir(obj)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'power', 'x']
測試
>>> hasattr(obj, 'x') # 有屬性'x'嗎县袱?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有屬性'y'嗎?
False
>>> setattr(obj, 'y', 19) # 設(shè)置一個屬性'y'
>>> hasattr(obj, 'y') # 有屬性'y'嗎佑力?
True
>>> getattr(obj, 'y') # 獲取屬性'y'
19
>>> obj.y # 獲取屬性'y'
19
實例屬性和類屬性
1 給一個實例綁定一個實例變量
class Student(object):
def __init__(self,name):
self.name = name
s = Student('Alice')
s.age = 10 #動態(tài)給一個實例綁定變量
2 類屬性
class Student(object):
name = "Student"
>>> s = Student() # 創(chuàng)建實例s
>>> print(s.name) # 打印name屬性式散,因為實例并沒有name屬性,所以會繼續(xù)查找class的name屬性
Student
>>> print(Student.name) # 打印類的name屬性
Student
>>> s.name = 'Michael' # 給實例綁定name屬性
>>> print(s.name) # 由于實例屬性優(yōu)先級比類屬性高打颤,因此暴拄,它會屏蔽掉類的name屬性
Michael
>>> print(Student.name) # 但是類屬性并未消失,用Student.name仍然可以訪問
Student
>>> del s.name # 如果刪除實例的name屬性
>>> print(s.name) # 再次調(diào)用s.name编饺,由于實例的name屬性沒有找到乖篷,類的name屬性就顯示出來了
Student
使用slots:給類綁定屬性和方法
一般綁定屬性
class Studeng():
pass
>> s = Studeng()
>> s.name = "haha" # 動態(tài)給實例綁定一個屬性
>> print(s.name)
一般綁定方法
>>> def set_name(self,name): #定義一個方法
self.name = name;
>>> s = Student()
>>> s.set_name = MethodType(set_name,s) #給實例綁定一個方法
>>> s.set_name("haha")
>>> s.name
'haha'
#給類綁定方法
>>> def set_score(self, score):
self.score = score
>>> Student.set_score = set_score
使用__slots__綁定
class User(object):
__slots__ = ('name','age') #用tuple定義允許綁定的屬性名稱
>>> s = User()
>>> s.name = 'haha'
>>> s.age = '22'
>>> s.score = 100
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
s.score = 100
AttributeError: 'User' object has no attribute 'score'
注:__slots__定義的屬性僅對當(dāng)前類實例起作用,對繼承的子類是不起作用的透且,除非在子類中也定義__slots__
使用@property
更簡單的getter setter ,@property裝飾器就是負(fù)責(zé)把一個方法變成屬性
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
@property
def age(self):
return 2015 - self._birth
---------------------------------------------------
@property 就是把一個方法轉(zhuǎn)變?yōu)橐粋€屬性,屬于getter方法撕蔼。
@ .setter 也是把一個方法轉(zhuǎn)變?yōu)橐粋€屬性,屬于setter方法
只有@property 是一個只讀屬性。代碼里面的age方法