zoukankan      html  css  js  c++  java
  • python用特殊方法定制类(不全)

    定义在class中不需要直接调用,python的某些函数或操作符会自动的调用对应的特殊方法.

    1、python中 __str__和__repr__

    __str__()用于显示给用户,而__repr__()用于显示给开发人员。__str__是可打印的字符输出,内建str()及print语句

     1 class Person(object):
     2     def __init__(self, name, gender):
     3         self.name = name
     4         self.gender = gender
     5 
     6     def __str__(self):
     7         return '(Person: %s, %s)' % (self.name, self.gender)
     8 
     9     __repr__ = __str__ #直接让repr和str相同
    10 
    11 p=Person('chengjiaxing','femail')
    12 print(p)   #输出(Person: chengjiaxing, femail)
    13  

    2、python中 __cmp__

    为了对对象进行排序,可以使用函数sorted函数,前提是设置了类的__cmp__方法。

     1 class Student(object):
     2     def __init__(self, name, score):
     3         self.name = name
     4         self.score = score
     5     def __str__(self):
     6         return '(%s: %s)' % (self.name, self.score)
     7     __repr__ = __str__
     8  
     9     def __cmp__(self, s):
    10         if self.name < s.name:
    11             return -1
    12         elif self.name > s.name:
    13             return 1
    14         else:
    15             return 0
    16 
    17 >>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)]
    18 >>> print sorted(L)
    19 [(Alice: 77), (Bob: 88), (Tim: 99)]

    3、python中 __len__

    调用len()返回实例的长度.

    斐波那契数列是由 0, 1, 1, 2, 3, 5, 8...构成。

    请编写一个Fib类,Fib(10)表示数列的前10个元素,print Fib(10) 可以打印出数列的前 10 个元素,len(Fib(10))可以正确返回数列的个数10。

     1 class Fib(object):
     2     def __init__(self,num):
     3         a,b,L=0,1,[]
     4         for n in range(num):
     5             L.append(a)
     6             a,b=b,a+b
     7         self.numbers=L
     8 
     9     def __str__(self):
    10         return str(self.numbers)
    11 
    12     __repr__=__str__
    13 
    14     def __len__(self):
    15         return len(self.numbers)
    16 
    17 
    18 f=Fib(10)
    19 print(f)
    20 print(len(f))

    4、python中类型转换

     1 class Rational(object):
     2     def __init__(self, p, q):
     3         self.p = p
     4         self.q = q
     5 
     6     def __int__(self):
     7         return self.p //self.q
     8 
     9     def __float__(self):
    10         return float(self.p) /float(self.q)
    11 
    12 
    13 print(float(Rational(7, 2)))   #3.5
    14 print(float(Rational(1, 3)))  #0.3333333333333333
    15 print(int(Rational(7,2)))    #3
     

    5、python中运算符重载

     1 class Time60(object):
     2     def __init__(self,hr,min):
     3         self.hr=hr
     4         self.min=min
     5 
     6     def __str__(self):
     7         return '%d:%d'%(self.hr,self.min)
     8 
     9     def __add__(self,other):  #重载 + 操作符
    10         if self.min+other.min >60:
    11             minute=max(self.min,other.min)-min(self.min,other.min)
    12             hr=self.hr+other.hr+1
    13         else:
    14             hr=self.hr+other.hr
    15             minute=self.min+other.min
    16         return self.__class__(hr,minute)
    17         #Time60(hr,minute)
    18 
    19 
    20     def __iadd__(self, other): #重载 += 操作符
    21         if self.min+other.min >60:
    22             self.min=max(self.min,other.min)-min(self.min,other.min)
    23             self.hr=self.hr+other.hr+1
    24         else:
    25             self.hr=self.hr+other.hr
    26             self.min=self.min+other.min
    27         return  self
    28 
    29     __repr__=__str__
    30 
    31 mon=Time60(6,54)
    32 tue=Time60(3,47)
    33 print(mon,tue)     #6:54 3:47
    34 print(mon+tue)    #10:7
    35 mon+=tue
    36 print(mon)            #10:7

     转载:https://www.cnblogs.com/oucsheep/p/6711461.html

  • 相关阅读:
    51 Nod 1068 Bash游戏v3
    51 Nod Bash 游戏v2
    51 Nod 1073 约瑟夫环
    UVA 12063 Zeros and ones 一道需要好好体会的好题
    51 Nod 1161 Partial sums
    2018中国大学生程序设计竞赛
    UVA 11971 Polygon
    UVA 10900 So do you want to be a 2^n-aire?
    UVA 11346 Possibility
    python with as 的用法
  • 原文地址:https://www.cnblogs.com/xiongxueqi/p/8583317.html
Copyright © 2011-2022 走看看