python学习(7)定制类的特殊方法

形如__xxx__的函数是类的特殊方法。

常需要修改的特殊方法有下面这些:

__str__()

print语句输出的结果。

__repr__()

命令行直接输入类名的输出结果。

class Person(object):

    def __init__(self, name, gender):

        self.name = name

        self.gender = gender

    def __str__(self):

        return '(Person: %s, %s)' % (self.name, self.gender)

    __repr__ = __str__

p = Person('Bob', 'male')

print p

>>> p

输出:

(Person: Bob, male)

(Person: Bob, male)

__cmp__()

类的比较规则。

class Student(object):

    def __init__(self, name, score):

        self.name = name

        self.score = score

    def __cmp__(self, s):

        if self.score < s.score :

            return -1

        elif self.score > s.score :

            return 1

        else:

            return 0

__len__()

类似list的类返回的元素数量。

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

数学运算符

__add__()、__sub__()、__mul__()、__div__()

有理数的加减乘除:

def gcs(a,b,c=1):

    if 0==a%2 and 0==b%2:

        return gcs(a/2,b/2,c*2);

        

    s = abs(a-b)

    m = min(a,b)

    if s == m:

        return m*c

    return gcs(s,m,c)

 

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)

类型转换

__int__()、__float__()等

把有理数转换为整数和浮点数:

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 self.p*1.0/self.q

@property装饰器与@score.setter装饰器

一起使用,用于把getter和setter方法变成属性。

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

 

s = Student()

s.score = 60 # OK,实际转化为s.set_score(60)

s.score # OK,实际转化为s.get_score()

s.score = 9999

输出:

60

Traceback (most recent call last):

  ...

ValueError: score must between 0 ~ 100!

__slots__()

指定一个类允许的属性列表。

class Person(object):

    __slots__ = ('name', 'gender')

__call__()

把一个类变成一个可调用的对象。

class ImFunc(object):

    def __call__(self,words):

        print 'i say %s' % words

imfunc = ImFunc()    

imfunc('what the func?') #把类当函数使用

时间: 2024-11-01 04:30:07

python学习(7)定制类的特殊方法的相关文章

Python类的定义、继承及类对象使用方法简明教程

  这篇文章主要介绍了Python类的定义.继承及类对象使用方法简明教程,本文用浅显易懂的语言讲解了类的定义.继承及类对象的使用,非常实用易懂,需要的朋友可以参考下 Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的一些特性,如人类有名字.身高和体重等属性,而具体值则会根据每个人的不同;功能则是类所能实现的行为,如人类拥有吃饭.走路和睡觉等功能.具体的形式如

python通过定义一个类实例作为ftp回调方法

  本文实例讲述了python通过定义一个类实例作为ftp回调方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 class Writer: def __init__(self, file): self.f = open(file, "w") def __call__(self, data): self.f.write(data) self.f.write('n') print data FILENAME = "AutoI

python实现的简单文本类游戏实现方法

  本文实例讲述了python实现的简单文本类游戏实现方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 ###################################

scanner-Java基础学习中Scanner类nextInt方法问题

问题描述 Java基础学习中Scanner类nextInt方法问题 import java.util.*; public class Practice { public static String prompt = "How are you? "; public static void main(String[] args) { Scanner console = new Scanner(System.in); System.out.print(prompt); //int year=

Python类的专用方法实例分析_python

本文实例讲述了Python类的专用方法.分享给大家供大家参考.具体分析如下: Python 类可以定义专用方法,专用方法是在特殊情况下或当使用特别语法时由 Python 替你调用的,而不是在代码中直接调用(象普通的方法那样). 1. __init__ 类似于构造函数 复制代码 代码如下: #!/usr/local/bin/python class Study:         def __init__(self,name=None):                 self.name = na

Python实现动态添加类的属性或成员函数的解决方法_python

某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或成员函数的解决方法,具体方法如下: 首先我们可以参考ulipad的实现:mixin. 这里做的比较简单,只是声明一个类,类初始化的时候读取配置文件,根据配置列表加载特定目录下的模块下的函数,函数和模块同名,将此函数动态加载为类的成员函数. 代码如下所示: class WinBAS(Bas): def

Python创建模块及模块导入的方法

  本文实例讲述了Python创建模块及模块导入的方法.分享给大家供大家参考.具体分析如下: python学习手册中写道: 定义模块,只要使用文本编辑器,把一些python代码输入到文本中,然后以.py为后缀名进行保存,任何此类文件都会被认为是python模块. 比如说,下面的代码输入到一个文件中,就可以看作是一个模块: ? 1 2 3 4 def printme(var): print var if __name__ == '__main__': printme(1) 假设说输入到a.py中,

在Python中使用元类的教程

  这篇文章主要介绍了在Python中使用元类的教程,是Python当中的基础知识,代码基于Python2.x版本,需要的朋友可以参考下 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: ? 1 2 3 class Hello(object): def hello(self, name='world'): print('Hello, %s.' % name) 当Py

[python学习] 模仿浏览器下载CSDN源文并实现PDF格式备份

        最近突然想给自己的博客备份下,看了两个软件:一个是CSDN博客导出软件,好像现在不能使用了:一个是豆约翰博客备份专家,感觉都太慢,而且不灵活,想单独下一篇文章就比较费时.而且我的毕业论文是基于Python自然语言相关的,所以想结合前面的文章用Python实现简单的功能:         1.通过网络下载本体的博客,包括图片:         2.在通过Python把HTML转换成PDF格式:         3.如果可能,后面可能会写文章对代码采用特定的方式进行处理.