欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python進(jìn)階_淺談面向?qū)ο筮M(jìn)階

 更新時(shí)間:2017年08月17日 08:44:55   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇python進(jìn)階_淺談面向?qū)ο筮M(jìn)階。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

學(xué)了面向?qū)ο笕筇匦岳^承,多態(tài),封裝。今天我們看看面向?qū)ο蟮囊恍┻M(jìn)階內(nèi)容,反射和一些類(lèi)的內(nèi)置函數(shù)。

一、isinstance和issubclass

class Foo:
 pass

class Son(Foo):
 pass

s = Son()
#判斷一個(gè)對(duì)象是不是這個(gè)類(lèi)的對(duì)象,傳兩個(gè)參數(shù)(對(duì)象,類(lèi))
print(isinstance(s,Son))
print(isinstance(s,Foo))
#type更精準(zhǔn)
print(type(s) is Son)
print(type(s) is Foo)

#判斷一個(gè)類(lèi)是不是另一類(lèi)的子類(lèi),傳兩個(gè)參數(shù)(子類(lèi),父類(lèi))
print(issubclass(Son,Foo))
print(issubclass(Son,object))
print(issubclass(Foo,object))
print(issubclass(int,object))

二、反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪(fǎng)問(wèn)、檢測(cè)和修改它本身狀態(tài)或行為的一種能力(自?。_@一概念的提出很快引發(fā)了計(jì)算機(jī)科學(xué)領(lǐng)域關(guān)于應(yīng)用反射性的研究。它首先被程序語(yǔ)言的設(shè)計(jì)領(lǐng)域所采用,并在Lisp和面向?qū)ο蠓矫嫒〉昧顺煽?jī)。

python面向?qū)ο笾械姆瓷洌?/strong>通過(guò)字符串的形式操作對(duì)象相關(guān)的屬性。python中的一切事物都是對(duì)象(都可以使用反射)

四個(gè)可以實(shí)現(xiàn)反射的函數(shù):hasattr,getattr,setattr,delattr

下列方法適用于類(lèi)和對(duì)象(一切皆對(duì)象,類(lèi)本身也是一個(gè)對(duì)象)

class Foo:
 def __init__(self):
  self.name = 'egon'
  self.age = 73

 def func(self):
  print(123)

egg = Foo()
#常用:
#hasattr
#getattr
# print(hasattr(egg,'name'))
print(getattr(egg,'name'))
if hasattr(egg,'func'): #返回bool
 Foo_func = getattr(egg,'func') #如果存在這個(gè)方法或者屬性,就返回屬性值或者方法的內(nèi)存地址
         #如果不存在,報(bào)錯(cuò),因此要配合hasattr使用
 Foo_func()
#不常用:
#setattr
# setattr(egg,'sex','屬性值')
# print(egg.sex)
# def show_name(self):
#  print(self.name + ' sb')
# setattr(egg,'sh_name',show_name)
# egg.sh_name(egg)
# show_name(egg)
# egg.sh_name()

#delattr
# delattr(egg,'name')
# print(egg.name)


# print(egg.name)
# egg.func()
# print(egg.__dict__)


#反射
#可以用字符串的方式去訪(fǎng)問(wèn)對(duì)象的屬性、調(diào)用對(duì)象的方法
反射舉例1
class Foo:
 f = 123 #類(lèi)變量
 @classmethod
 def class_method_demo(cls):
  print('class_method_demo')
 @staticmethod
 def static_method_demo():
  print('static_method_demo')
# if hasattr(Foo,'f'):
#  print(getattr(Foo,'f'))
print(hasattr(Foo,'class_method_demo'))
method = getattr(Foo,'class_method_demo')
method()
print(hasattr(Foo,'static_method_demo'))
method2 = getattr(Foo,'static_method_demo')
method2()
#類(lèi)也是對(duì)象
反射舉例2
import my_module
# print(hasattr(my_module,'test'))
# # func_test = getattr(my_module,'test')
# # func_test()
# getattr(my_module,'test')()
#import其他模塊應(yīng)用反射

from my_module import test


def demo1():
 print('demo1')

import sys
print(__name__) #'__main__'
print(sys.modules)
#'__main__': <module '__main__' from 'D:/Python代碼文件存放目錄/S6/day26/6反射3.py'>
module_obj =sys.modules[__name__] #sys.modules['__main__']
# module_obj : <module '__main__' from 'D:/Python代碼文件存放目錄/S6/day26/6反射3.py'>
print(module_obj)
print(hasattr(module_obj,'demo1'))
getattr(module_obj,'demo1')()
#在本模塊中應(yīng)用反射
反射舉例3
#對(duì)象
#類(lèi)
#模塊 : 本模塊和導(dǎo)入的模塊

def register():
 print('register')

def login():
 pass

def show_shoppinglst():
 pass
#
print('注冊(cè),登錄')
ret = input('歡迎,請(qǐng)輸入您要做的操作: ')
import sys
print(sys.modules)
# my_module = sys.modules[__name__]
# if hasattr(my_module,ret):
#  getattr(my_module,ret)()
if ret == '注冊(cè)':
 register()
elif ret == '登錄':
 login()
elif ret == 'shopping':
 show_shoppinglst()
反射舉例4
def test():
 print('test')

三、類(lèi)的內(nèi)置函數(shù)

1、__str__和__repr__

class Foo:
 def __init__(self,name):
  self.name = name
 def __str__(self):
  return '%s obj info in str'%self.name
 def __repr__(self):
  return 'obj info in repr'

f = Foo('egon')
# print(f)
print('%s'%f)
print('%r'%f)
print(repr(f)) # f.__repr__()
print(str(f))
#當(dāng)打印一個(gè)對(duì)象的時(shí)候,如果實(shí)現(xiàn)了str,打印中的返回值
#當(dāng)str沒(méi)有被實(shí)現(xiàn)的時(shí)候,就會(huì)調(diào)用repr方法
#但是當(dāng)你用字符串格式化的時(shí)候 %s和%r會(huì)分別去調(diào)用__str__和__repr__
#不管是在字符串格式化的時(shí)候還是在打印對(duì)象的時(shí)候,repr方法都可以作為str方法的替補(bǔ)
#但反之不行
#用于友好的表示對(duì)象。如果str和repr方法你只能實(shí)現(xiàn)一個(gè):先實(shí)現(xiàn)repr

2、__del__

class Foo:
 def __del__(self):
  print('執(zhí)行我啦')

f = Foo()
print(123)
print(123)
print(123)
#析構(gòu)方法,當(dāng)對(duì)象在內(nèi)存中被釋放時(shí),自動(dòng)觸發(fā)執(zhí)行。
#注:此方法一般無(wú)須定義,因?yàn)镻ython是一門(mén)高級(jí)語(yǔ)言,程序員在使用時(shí)無(wú)需關(guān)心內(nèi)存的分配和釋放,因?yàn)榇斯ぷ鞫际墙唤oPython解釋器來(lái)執(zhí)行,所以,析構(gòu)函數(shù)的調(diào)用是由解釋器在進(jìn)行垃圾回收時(shí)自動(dòng)觸發(fā)執(zhí)行的。

3、item系列

__getitem__\__setitem__\__delitem__

class Foo:
 def __init__(self):
  self.name = 'egon'
  self.age = 73
  
 def __getitem__(self, item):
  return self.__dict__[item]

 def __setitem__(self, key, value):
  # print(key,value)
  self.__dict__[key] = value

 def __delitem__(self, key):
  del self.__dict__[key]
f = Foo()
print(f['name'])
print(f['age'])
f['name'] = 'alex'
# del f['name']
print(f.name)
f1 = Foo()
print(f == f1)

4、__new__

# class A:
#  def __init__(self): #有一個(gè)方法在幫你創(chuàng)造self
#   print('in init function')
#   self.x = 1
#
#  def __new__(cls, *args, **kwargs):
#   print('in new function')
#   return object.__new__(A, *args, **kwargs)
# a = A()
# b = A()
# c = A()
# d = A()
# print(a,b,c,d)

#單例模式
class Singleton:
 def __new__(cls, *args, **kw):
  if not hasattr(cls, '_instance'):
   cls._instance = object.__new__(cls, *args, **kw)
  return cls._instance

one = Singleton()
two = Singleton()
three = Singleton()
go = Singleton()
print(one,two)

one.name = 'alex'
print(two.name)

5、__call__

class Foo:
 def __init__(self):
  pass
 def __call__(self, *args, **kwargs):
  print('__call__')

obj = Foo() # 執(zhí)行 __init__
obj() # 執(zhí)行 __call__
Foo()() # 執(zhí)行 __init__和執(zhí)行 __call__
#構(gòu)造方法的執(zhí)行是由創(chuàng)建對(duì)象觸發(fā)的,即:對(duì)象 = 類(lèi)名() ;而對(duì)于 __call__ 方法的執(zhí)行是由對(duì)象后加括號(hào)觸發(fā)的,即:對(duì)象() 或者 類(lèi)()()

6、__len__,__hash__

class Foo:
 def __len__(self):
  return len(self.__dict__)
 def __hash__(self):
  print('my hash func')
  return hash(self.name)
f = Foo()
print(len(f))
f.name = 'egon'
print(len(f))
print(hash(f))

7、__eq__

class A:
 def __init__(self):
  self.a = 1
  self.b = 2

 def __eq__(self,obj):
  if self.a == obj.a and self.b == obj.b:
   return True
a = A()
b = A()
print(a == b)

#__eq__控制著==的結(jié)果

8、內(nèi)置函數(shù)實(shí)例

class FranchDeck:
 ranks = [str(n) for n in range(2,11)] + list('JQKA')
 suits = ['紅心','方板','梅花','黑桃']

 def __init__(self):
  self._cards = [Card(rank,suit) for rank in FranchDeck.ranks
          for suit in FranchDeck.suits]

 def __len__(self):
  return len(self._cards)

 def __getitem__(self, item):
  return self._cards[item]

deck = FranchDeck()
print(deck[0])
from random import choice
print(choice(deck))
print(choice(deck))

紙牌游戲
class FranchDeck:
 ranks = [str(n) for n in range(2,11)] + list('JQKA')
 suits = ['紅心','方板','梅花','黑桃']

 def __init__(self):
  self._cards = [Card(rank,suit) for rank in FranchDeck.ranks
          for suit in FranchDeck.suits]

 def __len__(self):
  return len(self._cards)

 def __getitem__(self, item):
  return self._cards[item]

 def __setitem__(self, key, value):
  self._cards[key] = value

deck = FranchDeck()
print(deck[0])
from random import choice
print(choice(deck))
print(choice(deck))

from random import shuffle
shuffle(deck)
print(deck[:5])

紙牌游戲2
class Person:
 def __init__(self,name,age,sex):
  self.name = name
  self.age = age
  self.sex = sex

 def __hash__(self):
  return hash(self.name+self.sex)

 def __eq__(self, other):
  if self.name == other.name and other.sex == other.sex:return True


p_lst = []
for i in range(84):
 p_lst.append(Person('egon',i,'male'))

print(p_lst)
print(set(p_lst))

#只要姓名和年齡相同就默認(rèn)為一人去重

去重

以上這篇python進(jìn)階_淺談面向?qū)ο筮M(jìn)階就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python自動(dòng)化辦公之讀取Excel數(shù)據(jù)的實(shí)現(xiàn)

    Python自動(dòng)化辦公之讀取Excel數(shù)據(jù)的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python實(shí)現(xiàn)Excel數(shù)據(jù)的讀取,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-05-05
  • 詳解Python中 sys.argv[]的用法簡(jiǎn)明解釋

    詳解Python中 sys.argv[]的用法簡(jiǎn)明解釋

    本篇文章主要介紹了詳解Python中 sys.argv[]的用法簡(jiǎn)明解釋?zhuān)【幱X(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • python騰訊語(yǔ)音合成實(shí)現(xiàn)過(guò)程解析

    python騰訊語(yǔ)音合成實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了python騰訊語(yǔ)音合成實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 如何在windows下安裝Pycham2020軟件(方法步驟詳解)

    如何在windows下安裝Pycham2020軟件(方法步驟詳解)

    這篇文章主要介紹了在windows下安裝Pycham2020軟件方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • django ajax json的實(shí)例代碼

    django ajax json的實(shí)例代碼

    今天就為大家分享一篇django ajax json的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • keras修改backend的簡(jiǎn)單方法

    keras修改backend的簡(jiǎn)單方法

    這篇文章主要介紹了keras修改backend的簡(jiǎn)單方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python中的默認(rèn)參數(shù)實(shí)例分析

    Python中的默認(rèn)參數(shù)實(shí)例分析

    這篇文章主要介紹了Python中的默認(rèn)參數(shù)實(shí)例分析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 基于Python的網(wǎng)頁(yè)自動(dòng)化工具DrissionPage的使用詳解

    基于Python的網(wǎng)頁(yè)自動(dòng)化工具DrissionPage的使用詳解

    DrissionPage 是一個(gè)基于 python 的網(wǎng)頁(yè)自動(dòng)化工具,它既能控制瀏覽器,也能收發(fā)數(shù)據(jù)包,還能把兩者合而為一,下面就跟隨小編一起來(lái)學(xué)習(xí)一下它的具體使用吧
    2024-01-01
  • Python中的進(jìn)程分支fork和exec詳解

    Python中的進(jìn)程分支fork和exec詳解

    這篇文章主要介紹了Python中的進(jìn)程分支fork和exec詳解,本文用實(shí)例講解fork()的使用,并講解了exec相關(guān)的8個(gè)方法等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Python創(chuàng)建普通菜單示例【基于win32ui模塊】

    Python創(chuàng)建普通菜單示例【基于win32ui模塊】

    這篇文章主要介紹了Python創(chuàng)建普通菜單,結(jié)合實(shí)例形式分析了Python基于win32ui模塊創(chuàng)建普通菜單及添加菜單項(xiàng)的相關(guān)操作技巧,并附帶說(shuō)明了win32ui模塊的安裝命令,需要的朋友可以參考下
    2018-05-05

最新評(píng)論