Python学习之定制类

本文和大家分享的主要是 python开发中定制类的相关内容,一起来看看吧,希望对大家学习和使用这部分内容有所帮助。

1. python中什么是特殊方法

任何数据类型的实例都有一个特殊方法:  __str__()

·  用于 print 的  __str__

·  用于 len 的  __len__

·  用于 cmp 的  __cmp__

·  特殊方法定义在 class 中

·  不需要直接调用

· Python 的某些函数或操作符会调用对应的特殊方法

file:///C:\Users\wlc\AppData\Local\Temp\ksohtml\wps8B49.tmp.jpg

正确实现特殊方法

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

·  有关联性的特殊方法都必须实现

·  __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__

对 int 、 str  等内置数据类型排序时, Python 的  sorted()  按照默认的比较函数  cmp  排序,但是,如果对一组  Student  类的实例排序时,就必须提供我们自己的特殊方法  __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__

如果一个类表现得像一个list ,要获取有多少个元素,就得用  len()  函数 .

要让 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

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中数学运算

Python  提供的基本数据类型  int 、 float  可以做整数和浮点的四则运算以及乘方等运算。

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中类型转换

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 的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用 __slots__ 也能节省内存。

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__

一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法  __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]

来源: 博客园

时间: 2024-10-28 05:10:22

Python学习之定制类的相关文章

Python学习心得:类与对象

教材:<简明Python教程> Python面向对象: 如shell这种面向过程的程序都是通过"操作数据的函数"或者"语句块"来设计函数. python的程序(面向对象): 类是一个"class"类型,对象是类中的一个实例. 类的属性包括了:域和方法.(即变量和函数) 属于一个对象或类的变量被称为域,一个定义在类中的函数,叫做类的方法. 类使用关键字"class"来创建.域和方法放在同一个缩进块中. 1.域有两种:

python中的定制类(转载)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

python学习——使用元类

type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hello(object): def hello(self, name='world'): print('Hello, %s.' % name) 当Python解释器载入hello模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的class对象,测试如下: >>> fro

python学习笔记1-元类__metaclass__

type 其实就是元类,type 是python 背后创建所有对象的元类 python 中的类的创建规则: 假设创建Foo 这个类 class Foo(Bar): def __init__(): pass Foo中有__metaclass__这个属性吗?如果有,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象,他是一个类,但是本身类就是对象,一个python文件模块也属于一个对象. 如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找

Python学习笔记008_类_对象

# 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它是不需要的>>> >>> # Python中的self就相当于Java中的this >>> # self ,一般都放在方法的第一个参数中这是默认的要求 class Ball: def setName(self,name): self.name=name d

Python学习笔记12—类

典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __init__(self, name): #初始化函数 self.name = name def getName(self): #类中的方法(函数) return self.name def color(self, color): print "%s is %s" % (self.name,

python学习笔记——旧类与新类继承中的构造函数

旧类以调用未绑定的超类构造方法 class OldDog: def __init__(self): print 'I am a old dog !' self.__hungry = True def eat(self): if self.__hungry: print 'I eat it !' self.__hungry = False else: print 'No thanks!' class OldWolf(OldDog): def __init__(self): OldDog.__ini

python学习笔记(七) 类和pygame实现打飞机游戏

python中类声明如下: class Student(object): def __init__(self, name, score): self.name = name self.score = score def printinfo(self): print('name is %s, score is %d'%(self.name, self.score)) Student类有两个成员变量,name和score,类的成员函数第一个参数都为self,用来实现成员变量的赋值,__init__是

python3学习笔记 定制类

__str__ class Student(object): def __init__(self, name): self.name = name def __str__(self): return 'Student object (name: %s)' % self.name __repr__ = __str__ #作用:可以直接打印内部信息 >>> print(Student('Michael')) Student object (name: Michael) __getattr__