class People(object):
# 構(gòu)造方法:__init__(),在實(shí)例化對象時(shí)自動(dòng)執(zhí)行的方法
def __init__(self, name, age):
self.name = name
self.age = age
print("創(chuàng)建對象成功.......")
# 析構(gòu)函數(shù):__del__(), 當(dāng)你刪除對象時(shí),自動(dòng)調(diào)用的方法
# 刪除對象:del 對象名
def __del__(self):
print("刪除對象成功.......")
用于初始化類的內(nèi)容部狀態(tài),也就是當(dāng)該類被實(shí)例化的時(shí)候就會執(zhí)行該函數(shù)。那么我們就可以把要先初始化的屬性放到這個(gè)函數(shù)里面。
init()方法是可選的,如果不提供,Python 會給出默認(rèn)的init方法。一般數(shù)據(jù)的獲取需要定義的get和set方法
網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁制作,對混凝土攪拌罐車等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計(jì),網(wǎng)站優(yōu)化推廣哪家好,專業(yè)成都網(wǎng)站營銷優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。
當(dāng)使用del 刪除對象時(shí),會調(diào)用他本身的析構(gòu)函數(shù),另外當(dāng)對象在某個(gè)作用域中調(diào)用完畢,在跳出其作用域的同時(shí)析構(gòu)函數(shù)也會被調(diào)用一次,這樣可以用來釋放內(nèi)存空間。
del()也是可選的,如果不提供,則Python 會在后臺提供默認(rèn)析構(gòu)函數(shù)如果要顯式的調(diào)用析構(gòu)函數(shù),可以使用del關(guān)鍵字,方式:del 對象名
repr和str這兩個(gè)方法都是用于顯示的,str是面向用戶的,而repr面向程序員。
想使用print(Object)顯示對象,那就需要重構(gòu)str。想直接輸入類對象Object來打印,那就需要重構(gòu)repr,當(dāng)然它也可以使用print(Object)顯示對象。區(qū)別在于:當(dāng)你打印一個(gè)類的時(shí)候,那么print首先調(diào)用的就是類里面的定義的str方法,而不是repr方法,在沒有str方法時(shí)才會去調(diào)用repr方法。
#定義類
>>> class Test():
def __init__(self):
self.ppx = "hello,python."
#實(shí)例化類,然后想直接獲取類的一些信息
>>> t = Test()
>>> t
<__main__.Test object at 0x0000000002F3EF28>
>>> print(t)
<__main__.Test object at 0x0000000002F3EF28>
在沒有str或者repr方法時(shí),上面打印類對象顯示的是對象的內(nèi)存地址
下面我們重構(gòu)下該類的repr以及str,看看它們倆的區(qū)別
>>> class TestRepr(Test):
def __repr__(self):
return "Show:%s"%self.ppx
>>> t1 = TestRepr()
>>> t1
Show:hello,python.
>>> print(t1)
Show:hello,python.
可以看到,重構(gòu)repr方法后,不管直接輸出對象還是通過print打印的信息都按我們repr方法中定義的格式進(jìn)行顯示
>>> class TestStr(Test):
def __str__(self):
return "Show: %s"%self.ppx
>>> t2 = TestStr()
>>> t2
<__main__.TestStr object at 0x00000000031C33C8>
>>> print(t2)
Show: hello,python.
直接輸出對象ts時(shí)并沒有按我們str方法中定義的格式進(jìn)行輸出,而用print(Object)輸出的信息才會這樣顯示。
print("hello %s" % ('world'))
print("hello {0}".format((1, 2, 3, 4)))
print("hello {0} {1} {0} {1}".format((1, 2, 3, 4), "python"))
print("hello {0:.3f}".format(1.8989))
運(yùn)行輸出:
hello world
hello (1, 2, 3, 4)
hello (1, 2, 3, 4) python (1, 2, 3, 4) python
print("max:{max} min:{min}".format(min=10, max=100))
運(yùn)行輸出:
max:100 min:10
point = (3,4)
print("x:{0[0]}, y:{0[1]}".format(point))
輸出:
x:3, y:4
d = {'max':100.7849758475976, 'min':10.4756895769857985}
print("max:{max:.2f} min:{min:.3f}".format(**d))
運(yùn)行輸出:
max:100.78 min:10.476
class Book(object):
def __init__(self, name, author, state, bookIndex):
self.name = name
self.author = author
# 0:借出 1:未借出
self.state = state
self.bookIndex = bookIndex
# 打印對象時(shí)自動(dòng)調(diào)用;str(對象)
def __str__(self):
return "書名:{0.name} 狀態(tài):{0.state}".format(self)
# return "書名:{d.name} 狀態(tài):{d.state}".format(d=self)
b = Book("java", 'aa', 1, 'Index')
print(b)
運(yùn)行輸出:
書名:java 狀態(tài):1
# 定義一個(gè)存儲年月日輸出格式的字典
formats = {
'ymd':"{d.year}-{d.month}-{d.day}",
'mdy':"{d.month}/{d.day}/{d.year}",
}
class Date(object):
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
# format方法: format(對象名)時(shí)自動(dòng)調(diào)用
def __format__(self, format_spec=None):
if not format_spec:
format_spec = 'ymd'
fmt = formats[format_spec] # "{d.year}-{d.month}-{d.day}".format(d=d)
return fmt.format(d=self)
d = Date(2019, 8, 25)
print(format(d)) #不傳入?yún)?shù)
print(format(d, 'mdy')) #傳入?yún)?shù)
運(yùn)行輸出:
2019-8-25
8/25/2019
習(xí)慣了高級語言的嚴(yán)謹(jǐn),總想對屬性加以訪問控制,相對安全些,比如直接在init中定義公用屬性,從封裝性來說,它是不好的寫法。屬性訪問控制機(jī)制,其一是@propery關(guān)鍵字。用此關(guān)鍵字,其獲取、設(shè)置函數(shù),須與屬性名一致。
br/>屬性訪問控制機(jī)制,其一是@propery關(guān)鍵字。用此關(guān)鍵字,其獲取、設(shè)置函數(shù),須與屬性名一致。
from requests.compat import basestring
class Animal(object):
def __init__(self, name, age):
self._name = name
self._age = age
self._color = 'Black'
# 將普通方法變?yōu)閷傩苑椒? @property
def name(self):
return self._name
# 當(dāng)更改name的值時(shí),自動(dòng)調(diào)用下面這個(gè)方法。這樣就可以更改屬性的值了
@name.setter
def name(self, value):
if isinstance(value, basestring):
self._name = value
else:
self._name = 'No name'
#獲取值
@name.getter
def get(self):
return self.name
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value > 0 and value < 100:
self._age = value
else:
self._age = 0
@property
def color(self):
return self._color
@color.setter
def color(self, value):
self._color = value;
a = Animal('black dog', 3)
a.name = 'white dog'
a.age = 55
a.color = 'red'
print('Name:', a.name)
print('Age:', a.age)
print('Color:', a.color)
print(a.get)
運(yùn)行結(jié)果:
Name: white dog
Age: 55
Color: red
white dog
魔術(shù)方法getitem、setitem與delitem
1.對列表的操作
class Student(object):
def __init__(self, name, scores):
self.name = name
self.scores = scores
# 支持索引; s[index]
def __getitem__(self, index):
# print("獲取索引對應(yīng)的value值")
return self.scores[index]
# s[索引] = 修改的值
def __setitem__(self, index, value):
self.scores[index] = value
# del s[索引]
def __delitem__(self, index):
del self.scores[index]
def hello(self):
return "hello"
s = Student('westos', [101, 100, 100])
# *********************************索引**************************
print(s[0])
print(s[1])
print(s[2])
#更改值
s[0] = 200
print(s[0])
print(s.scores)
#刪除值
del s[0]
print(s.scores)
# *********************************切片**************************
print(s[1:3])
s[1:3] = [0,0]
print(s[:])
del s[:-1]
print(s[:])
print(s[0])
運(yùn)行結(jié)果:
101
100
100
200
[200, 100, 100]
[100, 100]
[100]
[100, 0, 0]
[0]
0
2.對字典的操作
class Student(object):
def __init__(self, name, scores):
self.name = name
self.scores = scores
# 支持索引; s[key]
def __getitem__(self, key):
# print("獲取索引對應(yīng)的value值")
return self.__dict__[key]
# s[key] = 修改的值
def __setitem__(self, key, value):
self.__dict__[key] = value
# del s[key]
def __delitem__(self, key):
del self.__dict__[key]
def hello(self):
return "hello"
s = Student('westos', [101, 100, 100])
#**************************key獲取value值***********************
print(s.__dict__)
print(s['name'])
print(s['scores'])
s['name'] = 'westo1'
print(s['name'])
del s['name'] #刪除一個(gè)鍵值對
# print(s['name']) #如果查值,會報(bào)錯(cuò):key不存在
運(yùn)行結(jié)果:
{'name': 'westos', 'scores': [101, 100, 100]}
westos
[101, 100, 100]
westo1
當(dāng)一個(gè)類實(shí)現(xiàn)call方法時(shí),這個(gè)類的實(shí)例就會變成可調(diào)用對象。即函數(shù)。
1.
class ClassA:
def __call__(self, *args, **kwargs):
print('call ClassA instance.......')
# ClassA實(shí)現(xiàn)了__call__方法
a = ClassA()
#這個(gè)時(shí)候,ClassA的實(shí)例a,就變成可調(diào)用對象
#調(diào)用a(),輸出call ClassA instance,說明是調(diào)用了__call__函數(shù)
a()
# 其實(shí)a()等同于a.__call__(),它本質(zhì)上就是后者的縮寫
a.__call__()
運(yùn)行結(jié)果:
call ClassA instance.......
call ClassA instance.......
2.
class Dddd(object):
def __init__(self, origin):
self.origin = origin
print("origin :"+str(origin))
def __call__(self, x):
print("x :"+str(x))
p = Dddd(100)
p(2000)
運(yùn)行結(jié)果:
origin :100
x :2000
class Student(object):
def __init__(self, name, scores, power):
self.name = name
self.scores = scores
self.power = power
# 實(shí)例化對象之前先執(zhí)行下面這個(gè)new魔術(shù)方法
def __new__(cls, *args, **kwargs):
# 判斷是否obj對象是否已經(jīng)被創(chuàng)建, 如果沒有被創(chuàng)建, 則創(chuàng)建,
if not hasattr(cls, 'obj'):
cls.obj = object.__new__(cls)
# 如果已經(jīng)創(chuàng)建成功,則返回創(chuàng)建好的對象
return cls.obj
s1 = Student('westos1', [101,100,100], 100)
s2 = Student('westos1', [101,100,100], 100)
print(s1)
print(s2)
運(yùn)行結(jié)果:
<__main__.Student object at 0x7fedfa2ebef0>
<__main__.Student object at 0x7fedfa2ebef0>
可以看見,對象s1,s2他們指向的地址相同,即他們時(shí)同一個(gè)對象。而不是兩個(gè)相同值的對象。
enter()與exit()
class MyOpen(object):
def __init__(self, filename, mode='r'):
self._name = filename
self._mode = mode
# 當(dāng)with語句開始運(yùn)行的時(shí)候,執(zhí)行此方法;
def __enter__(self):
self.f = open(self._name, self._mode)
return self.f
# 當(dāng)with語句執(zhí)行結(jié)束之后運(yùn)行;
def __exit__(self, exc_type, exc_val, exc_tb):
self.f.close()
with MyOpen('/etc/passwd') as f:
print(f.closed)
print(f.read(5))
print(f.closed)
運(yùn)行如果:
False
root:
True
反射:主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力(自?。?br/>python面向?qū)ο笾械姆瓷洌和ㄟ^字符串的形式操作對象相關(guān)的屬性。python中的一切事物都是對象(都可以使用反射)。即 讓對象告訴我們相關(guān)信息(對象擁有的屬性和方法, 對象所屬的類等....)
hasattr(object,name)
判斷object中有沒有一個(gè)name字符串對應(yīng)的方法或?qū)傩裕⒁馑接袑傩曰蛘叻椒ú荒芘袛喑鰜?br/>getattr(object, name, default=None)
獲取object中有沒有對應(yīng)的方法和屬性,私有屬性或者方法不能判斷出來不能獲取到。default是設(shè)置當(dāng)獲取不到時(shí)的返回值,默認(rèn)為None
setattr(x, y, v)
修改或添加對象的屬性
delattr(x, y)
刪除類或?qū)ο蟮膶傩?/p>
class Student(object):
"""
這是student類的幫助文檔
"""
def __init__(self, name, age):
self.name = name
self.__age = age
def get_score(self):
return "score"
def get_grade(self):
return 'grade'
s1 = Student("fentiao", 10)
print(type(s1))
print(isinstance(s1, Student))
print(isinstance('hello', Student))
# 跟據(jù)對象可以獲取的內(nèi)容
print(s1.__class__) #類信息
print(s1.__dict__) #生成字典
print(s1.__doc__) #獲取幫助文檔
# hasattr, getattr, setattr, delattr
# hasattr: 判斷對象是否包含對應(yīng)的屬性或者方法名;
print(hasattr(s1, 'name'))
print(hasattr(s1, '__age')) # 私有屬性, 私有方法, 是不能判斷的;
print(hasattr(s1, 'score'))
print(hasattr(s1, 'get_score'))
print(hasattr(s1, 'set_score'))
# getattr
print(getattr(s1, 'name'))
print(getattr(s1, '__age', 'no attr'))
print(getattr(s1, 'get_score', 'no method')) # 獲取方法名, 如果要執(zhí)行方法, 直接調(diào)用即可
print(getattr(s1, 'set_score', 'no method')) # 獲取方法名, 如果要執(zhí)行方法, 直接調(diào)用即可
# setattr:
# 修改某個(gè)屬性的值
setattr(s1, 'name', 'westos')
print(getattr(s1, 'name'))
# 添加某個(gè)屬性及對應(yīng)的值;
setattr(s1, 'score', 100)
print(getattr(s1, 'score'))
# 修改方法
def get_score1():
return "這是修改的方法內(nèi)容"
setattr(s1, 'get_score', get_score1)
print(getattr(s1, 'get_score')())
def set_score():
return "這是添加的方法"
# 添加方法
setattr(s1, 'set_score', set_score)
print(getattr(s1, 'set_score')())
# delattr
delattr(s1, 'name')
print(hasattr(s1, 'name'))
print(hasattr(s1, 'set_score'))
delattr(s1, 'set_score')
print(hasattr(s1, 'set_score'))
運(yùn)行結(jié)果:
<class '__main__.Student'>
True
False
<class '__main__.Student'>
{'name': 'fentiao', '_Student__age': 10}
這是student類的幫助文檔
True
False
False
True
False
fentiao
no attr
<bound method Student.get_score of <__main__.Student object at 0x7efc6b8a3ac8>>
no method
westos
100
這是修改的方法內(nèi)容
這是添加的方法
False
True
False
網(wǎng)站欄目:Python學(xué)習(xí)—面向?qū)ο髮W(xué)習(xí)下
瀏覽路徑:http://jinyejixie.com/article18/iiccgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、營銷型網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)站導(dǎo)航、面包屑導(dǎo)航、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)