1、特殊方法

定义在class中

不需要直接调用,python的某些函数或操作符会自动的调用对应的特殊方法。

如定义了person类,使用print p 语句打印person类的实例时,就调用了特殊方法__str__()

此时就需要在person类中实现这个方法。

使用特殊方法时注意:

只需要编写用到的特殊方法

有关联性的特殊方法都必须实现(如__getattr__,__setattr__,delattr__)

2、python中 __str__和__repr__

__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__ #直接让repr和str相同

定义了repr函数后,在调试时直接向命令行输入p即可输出person的信息,否则会输出

<__main__.Person object at 0x0000000002E66C88>

__str__和__repr__函数会被子类继承。

3、python中 __cmp__

为了对对象进行排序,可以使用函数sorted函数,前提是设置了类的__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
 
>>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)]
>>> print sorted(L)
[(Alice: 77), (Bob: 88), (Tim: 99)]
 

4、python中 __len__

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

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
任务:

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

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

代码1:(参考代码)

可以使用str()将整型列表转化为字符串。

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)

代码2:(自己写的)

class Fib(object):

    def __init__(self, num):
self.num = num def __str__(self):
if(self.num==1):
return "[0]"
elif(self.num==2):
return "[0,1]"
else:
fib_str = "[0,"
fib=[0,1]
for k in range(2,self.num+1):
fib_str = fib_str+ str(fib[k-1]) + ","
fib.append(fib[k-1]+fib[k-2])
return fib_str[:-1]+']'
def __len__(self):
return self.num f = Fib(10)
print f
print len(f)

5、python中数学运算(运算符重载)

例:有理数可以用p/q表示,其中p和q都是整数。

调用求最大公约数的gcd函数(递归):

欧几里得定理:若a=b*r+q,则 GCD(a,b)=GCD(b,q)

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-r.p*self.q,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中类型转换

__int__ 和 __float__方法实现类型转换,
__str__ 方法也可以看做是一种类型转换。
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)/float(self.q) print float(Rational(7, 2))
print float(Rational(1, 3))

7、python中 @property(装饰器函改写set和get方法)

@property 修饰方法后即是get方法。

“@+方法名字+点+setter”是个固定格式与@property搭配使用,set方法。

如果没有定义set方法,就不能对“属性”赋值,这时,就可以创建一个只读“属性”。

 
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

8、python中 __slots__ 属性限制

__slots__规定了一个类允许的属性列表。不允许添加列表外的属性。

class Student(object):
__slots__ = ('name', 'gender', 'score')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
强行添加grade属性会报错。
>>> s = Student('Bob', 'male', 59)
>>> s.name = 'Tim' # OK
>>> s.score = 99 # OK
>>> s.grade = 'A'
Traceback (most recent call last):
...
AttributeError: 'Student' object has no attribute 'grade'

9、python中__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...
 
第四节的斐波那契数列问题,可以改用call实现。
class Fib(object):

    def __call__(self,num):
a=0
b=1
L=[] for n in range(1,num+1):
L.append(a) temp = b b = a + b
a = temp return L f = Fib()
print f(10)
 
参考代码:
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)

注意代码中 高亮语句,使用参考代码的写法,就省去了一个中间变量。

 

Python 定制类 特殊方法的更多相关文章

  1. Python定制类(进阶6)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6411919.html 本文出自:[Edwin博客园] Python定制类(进阶6) 1. python中什么 ...

  2. python定制类(1):__getitem__和slice切片

    python定制类(1):__getitem__和slice切片 1.__getitem__的简单用法: 当一个类中定义了__getitem__方法,那么它的实例对象便拥有了通过下标来索引的能力. c ...

  3. python 定制类

    看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让cla ...

  4. python定制类详解

    1.什么是定制类python中包含很多内置的(Built-in)函数,异常,对象.分别有不同的作用,我们可以重写这些功能. 2.__str__输出对象 class Language(object): ...

  5. python基础--类的方法

    一:类的方法说明 类的方法分为实例方法,析构方法,构造方法,类方法,静态方法,属性方法,等等 类方法和静态方法都可以被类和类实例调用,类实例方法仅可以被类实例调用 类方法的隐含调用参数是类,而类实例方 ...

  6. Python - 查看类的方法和属性,dir(),help()

    1. dir()查看类的方法和属性 查看slice类的方法和属性 dir(slice) 2.help() 查看某个方法的文档 查看slice类中的indices方法 help(slice.indice ...

  7. Python 定制类与其对象的创建和应用

    1.创建新类Athlete,创建两个唯一的对象实例sarah james,他们会继承Athlete类的特性 >>> class Athlete: def __init__(self, ...

  8. python定制类(以Fib类为例)

    class Fib(object): def __init__(self): self.a, self.b = 0, 1 def __iter__(self): return self def __n ...

  9. Python元类__prepare__方法深入理解

    学习元类的时候,对__prepare__不是很理解,书上讲解的也不是很详细,最后通过查看stackoverflow的一些帖子对该方法有了一些理解,记录如下: 先看代码: class member_ta ...

随机推荐

  1. C# CS1591 缺少对公共可见类型或成员的 XML 注释 问题解决

    最近在写web api的项目,用到微软的Web api help page组件,用于自动对生成API文档,见博文: https://www.cnblogs.com/lenmom/p/9081363.h ...

  2. CVE-2018-8420 漏洞复现

    影响的 Windows 版本: Microsoft Windows 10 Version 1607 for 32-bit SystemsMicrosoft Windows 10 Version 160 ...

  3. Electron 前端页面导入jQuery 出现错误Uncaught ReferenceError: jQuery is not defined

    如下: <script src="../assets/js/jquery-1.10.2.js"></script> 方法1 改为: <script&g ...

  4. Hive常见问题汇总

    参考资料: Hive常见问题汇总 啟動hive出錯,提示沒有權限 2015年04月02日 09:58:49 阅读数:31769 这里小编汇集,使用Hive时遇到的常见问题. 1,执行#hive命令进入 ...

  5. 4_bootstrap之栅格系统

    4.栅格系统 4.1.简述栅格系统 为了方便在布局容器中进行网页的布局操作. BootStrap提供了一套专门用于响应式开发布局的栅格系统. 栅格系统将一行分为12列,通过设定元素占用的列数来 布局元 ...

  6. cmd变量,参数,for循环,

    @echo offrem  *****************************************************rem  Create By Q_rui CopryRight@_ ...

  7. Python中的strip()函数的用法

    函数:string.strip() Python strip() 方法用于移除字符串头尾指定的字符(默认为空格). 一.函数说明 strip() 语法:str.strip([rm]); 参数说明 rm ...

  8. tensorflow 基本函数(1.tf.split, 2.tf.concat,3.tf.squeeze, 4.tf.less_equal, 5.tf.where, 6.tf.gather, 7.tf.cast, 8.tf.expand_dims, 9.tf.argmax, 10.tf.reshape, 11.tf.stack, 12tf.less, 13.tf.boolean_mask

    1.  tf.split(3, group, input)  # 拆分函数    3 表示的是在第三个维度上, group表示拆分的次数, input 表示输入的值 import tensorflow ...

  9. Spring security 3.1 +JSF 2.0 . problem with annotating methods in ManagedBeans?

    Hy .What i am trying to do is to integrate Spring security with a Jsf+spring IOC +hibernate applicat ...

  10. SC命令安装window服务

    sc create Styler binpath= "D:\Styler\Styler.exe" start= auto displayname= "Styler&quo ...