Python 7、定制类

☆定制类

特殊方法:
也叫魔术方法
问:Python如何把任意变量变成str?
答:任何数据类型的实例都有一个特殊方法
__str__()相当于Java的toString()方法

print lst
#其实,就是
print lst.__str__()

还有那些呢:

用于print__str__()
用于len__len__()
用于cmp__cmp__()

特点:
特殊方法定义在class中,不需要直接调用
Python的某些函数会自动调用对应的特殊方法

为了正确实现特殊方法<相当于Java的方法重写>,有关联方法的都要实现。


__str____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
==>(Person : Bob, male)
p
==><main.Person object at 0x10c9f57810)

#@注释一
__str__  用于print p
__repr__ 直接p

__cmp__: 碧螺春


__len__:

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.numbers = L
    def __str__(self):
        return str(self, numbers)
    __repr__ = __str__
    def __len__(self):
        return len(self.numbers)

f = Fib(10)
print f
print len(f)

Python中的数学运算:
Python提供的基本数据类型 int, float可以做整数和浮点数的四则运算,以及乘方等运算。
但是,四则运算不局限于 int 和 float, 还可以是有理数、矩阵等

#用Rational类表示有理数
class Rational(object):
    def __init__(self, p, q):
        self.p = p
        self.q = q
    #加法
    def __add__(self, r):
        return Ration(self.p*r.q + self.q*r.p, self.q*r.q)
    def __str__(self):
        return '%s / %s' % (self.p, self.q)

    #再在此添减法`__sub__`,乘法`__mul__`,除法`__div__`
    #注意 最大公约数 gcd ——辗转相除
r1 = Rational(1, 3)
r2 = Rational(1, 2)
print r1 + r2
==> 5/6

Python类型转换:
python中Rational类实现了有理数运算,但是如果要把结构转换为 int 或 float ,怎办。
把 Rational转换为int , 应该使用

r = Rational(12, 5)
n = int(r)

要让int 函数正常工作,只需要实现特殊方法 __init__()

class Rational(object):
    def __init__(self, p, q):
        self.p = p
        self.q = q
    def __int__(self):
        return self.p // self.q

print int(Rational(7, 2))

同理,需要让float函数正常工作,只需要实现特殊方法__float__()


@property


__slots__
由于Python是动态语言,任何实例在运行期间都可以动态地添加属性。
如果要限制添加的属性,例如,Student类只允许添加name, genderscore
可以利用 __slots__来实现

class Student(object):
    __slots__('name', 'gender', 'school')
    def __init__(self, name, gender, score):
        self.name = name
        self.gender = gender
        self.score = score
s = Student('Bob', 'male', 59)
s.age = 19
==>
AttributeError

__call__
__slots__ 的目的是限制当前类所拥有的属性,如果不需要动态添加属性
使用__slots__还能节省内存
Python中函数是对象,所有函数都是可调用对象
一个类实例也可以变成一个可调用对象,只需要实现__call__方法,即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值