99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python程序猿必知的定制類詳解

發(fā)布時(shí)間:2017-02-21 15:13  回復(fù):0  查看:2304   最后回復(fù):2017-02-21 15:13  
本文和大家分享的主要是 python開發(fā)中定制類的相關(guān)內(nèi)容,一起來看看吧,希望對(duì)大家學(xué)習(xí)和使用這部分內(nèi)容有所幫助。
   1. python中什么是特殊方法
  任何數(shù)據(jù)類型的實(shí)例都有一個(gè)特殊方法:  __str__()
  ·  用于 print 的  __str__
  ·  用于 len 的  __len__
  ·  用于 cmp 的  __cmp__
  ·  特殊方法定義在 class
  ·  不需要直接調(diào)用
  · Python 的某些函數(shù)或操作符會(huì)調(diào)用對(duì)應(yīng)的特殊方法
file:///C:\Users\wlc\AppData\Local\Temp\ksohtml\wps8B49.tmp.jpg
     正確實(shí)現(xiàn)特殊方法
  ·  只需要編寫用到的特殊方法
  ·  有關(guān)聯(lián)性的特殊方法都必須實(shí)現(xiàn)
  ·  __getattr__ ,  __setattr__ ,  __delattr__
   2. python中 __str____repr__
   class  Person(object):
   def  __init__(self, name, gender):
  self.name = name
  self.gender = gender
   class  Student(Person):
   def  __init__(self, name, gender, score):
  super(Student, self).__init__(name, gender)
  self.score = score
   def  __str__(self):
   return '(Student: %s, %s, %s)' % (self.name, self.gender, self.score)
  __repr__ = __str__
  s = Student('Bob', 'male', 88) print s
   3. python中 __cmp__
  對(duì) int 、 str  等內(nèi)置數(shù)據(jù)類型排序時(shí), Python 的  sorted()  按照默認(rèn)的比較函數(shù)  cmp  排序,但是,如果對(duì)一組  Student  類的實(shí)例排序時(shí),就必須提供我們自己的特殊方法  __cmp__()
   class  Student(object):
   def  __init__(self, name, score):
  self.name = name
  self.score = score
   def  __str__(self):
   return '(%s: %s)' % (self.name, self.score)
  __repr__ = __str__
   def  __cmp__(self, s):
   if self.name < s.name:
   return -1
   elif self.name > s.name:
   return 1
   else:
   return 0
   class  Student(object):
   def  __init__(self, name, score):
  self.name = name
  self.score = score
   def  __str__(self):
   return '(%s: %s)' % (self.name, self.score)
  __repr__ = __str__
   def  __cmp__(self, s):
   if self.score == s.score:
   return cmp(self.name, s.name)
   return -cmp(self.score, s.score)
  L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 99)] print sorted(L)
   4. python中 __len__
  如果一個(gè)類表現(xiàn)得像一個(gè)list ,要獲取有多少個(gè)元素,就得用  len()  函數(shù) .
  要讓 len()  函數(shù)工作正常,類必須提供一個(gè)特殊方法 __len__() ,它返回元素的個(gè)數(shù)。
   class  Students(object):
   def  __init__(self, *args):
  self.names = args
   def  __len__(self):
   return len(self.names)
  ss = Students('Bob', 'Alice', 'Tim') print len(ss) # 3
   class  Fib(object):
   def  __init__(self, num):
  a, b, L = 0, 1, []
   for n  in range(num):
  L.append(a)
  a, b = b, a + b
  self.num = L
   def  __len__(self):
   return len(self.num)
  f = Fib(10) print f.num # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] print len(f) # 10
   5. python中數(shù)學(xué)運(yùn)算
  Python  提供的基本數(shù)據(jù)類型  int 、 float  可以做整數(shù)和浮點(diǎn)的四則運(yùn)算以及乘方等運(yùn)算。
   def  gcd(a, b):
   if b == 0:
   return a
   return gcd(b, a % b)
   class  Rational(object):
   def  __init__(self, p, q):
  self.p = p
  self.q = q
   def  __add__(self, r):
   return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
   def  __sub__(self, r):
   return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
   def  __mul__(self, r):
   return Rational(self.p * r.p, self.q * r.q)
   def  __div__(self, r):
   return Rational(self.p * r.q, self.q * r.p)
   def  __str__(self):
  g = gcd(self.p, self.q)
   return '%s/%s' % (self.p / g, self.q / g)
  __repr__ = __str__
  r1 = Rational(1, 2)
  r2 = Rational(1, 4) print r1 + r2 print r1 - r2 print r1 * r2 print r1 / r2
   6. python中類型轉(zhuǎn)換
   print int(12.34) # 12 print float(12) # 12.0
   class  Rational(object):
   def  __init__(self, p, q):
  self.p = p
  self.q = q
   def  __int__(self):
   return self.p // self.q
   def  __float__(self):
   return float(self.p) / self.q
   print float(Rational(7, 2)) # 3.5 print float(Rational(1, 3)) # 0.333333333333
   7. python中 @property
   class  Student(object):
   def  __init__(self, name, score):
  self.name = name
  self.__score = score
  @property
   def  score(self):
   return self.__score
  @score.setter
   def  score(self, score):
   if score < 0  or score > 100:
   raise ValueError('invalid score')
  self.__score = score
  @property
   def  grade(self):
   if self.score < 60:
   return 'C'
   if self.score < 80:
   return 'B'
   return 'A'
  s = Student('Bob', 59) print s.grade
  s.score = 60 print s.grade
  s.score = 99 print s.grade
   8. python中 __slots__
  slots 的目的是限制當(dāng)前類所能擁有的屬性,如果不需要添加任意動(dòng)態(tài)的屬性,使用 __slots__ 也能節(jié)省內(nèi)存。
   class  Student(object):
  __slots__ = ('name', 'gender', 'score')
   def  __init__(self, name, gender, score):
  self.name = name
  self.gender = gender
  self.score = score
  s = Student('Bob', 'male', 59)
  s.name = 'Tim' # OK
  s.score = 99 # OK
  s.grade = 'A' # Error
   class  Person(object):
  __slots__ = ('name', 'gender')
   def  __init__(self, name, gender):
  self.name = name
  self.gender = gender
   class  Student(Person):
  __slots__ = {'score'}
   def  __init__(self, name, gender, score):
  super(Student, self).__init__(name, gender)
  self.score = score
  s = Student('Bob', 'male', 59)
  s.name = 'Tim'
  s.score = 99 print s.score
   9. python中 __call__
  一個(gè)類實(shí)例也可以變成一個(gè)可調(diào)用對(duì)象,只需要實(shí)現(xiàn)一個(gè)特殊方法  __call__()
   class  Person(object):
   def  __init__(self, name, gender):
  self.name = name
  self.gender = gender
   def  __call__(self, friend):
   print 'My name is %s...' % self.name
   print 'My friend is %s...' % friend
  p = Person('Bob', 'male')
  p('Tim') # My name is Bob... My friend is Tim...
   class  Fib(object):
   def  __call__(self, num):
  a, b, L = 0, 1, []
   for n  in range(num):
  L.append(a)
  a, b = b, a + b
   return L
  f = Fib() print f(10) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
來源: 博客園
您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?