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__classPerson(object):def__init__(self, name, gender):self.name = nameself.gender = genderclassStudent(Person):def__init__(self, name, gender, score):super(Student, self).__init__(name, gender)self.score = scoredef__str__(self):return’(Student: %s, %s, %s)’ % (self.name, self.gender, self.score)__repr__ = __str__s = Student(’Bob’, ’male’, 88)prints3. python中__cmp__对int、str等内置数据类型排序时,Python的sorted()按照默认的比较函数cmp排序,但是,如果对一组Student类的实例排序时,就必须提供我们自己的特殊方法__cmp__()classStudent(object):def__init__(self, name, score):self.name = nameself.score = scoredef__str__(self):return’(%s: %s)’ % (self.name, self.score)__repr__ = __str__def__cmp__(self, s):ifself.name < s.name:return-1elifself.name > s.name:return1else:return0classStudent(object):def__init__(self, name, score):self.name = nameself.score = scoredef__str__(self):return’(%s: %s)’ % (self.name, self.score)__repr__ = __str__def__cmp__(self, s):ifself.score == s.score:returncmp(self.name, s.name)return-cmp(self.score, s.score)L = [Student(’Tim’, 99), Student(’Bob’, 88), Student(’Alice’, 99)]printsorted(L)4. python中__len__如果一个类表现得像一个list,要获取有多少个元素,就得用len()函数.要让len()函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数。classStudents(object):def__init__(self, *args):self.names = argsdef__len__(self):returnlen(self.names)ss = Students(’Bob’, ’Alice’, ’Tim’)printlen(ss) # 3classFib(object):def__init__(self, num):a, b, L = 0, 1, []forninrange(num):L.append(a)a, b = b, a + bself.num = Ldef__len__(self):returnlen(self.num)f = Fib(10)printf.num # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]printlen(f) # 105. python中数学运算Python提供的基本数据类型int、float可以做整数和浮点的四则运算以及乘方等运算。defgcd(a, b):ifb == 0:returnareturngcd(b, a % b)classRational(object):def__init__(self, p, q):self.p = pself.q = qdef__add__(self, r):returnRational(self.p * r.q + self.q * r.p, self.q * r.q)def__sub__(self, r):returnRational(self.p * r.q - self.q * r.p, self.q * r.q)def__mul__(self, r):returnRational(self.p * r.p, self.q * r.q)def__div__(self, r):returnRational(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)printr1 + r2printr1 - r2printr1 * r2printr1 / r26. python中类型转换printint(12.34) # 12printfloat(12) # 12.0classRational(object):def__init__(self, p, q):self.p = pself.q = qdef__int__(self):returnself.p // self.qdef__float__(self):returnfloat(self.p) / self.qprintfloat(Rational(7, 2)) # 3.5printfloat(Rational(1, 3)) # 0.3333333333337. python中@propertyclassStudent(object):def__init__(self, name, score):self.name = nameself.__score = score@propertydefscore(self):returnself.__score@score.setterdefscore(self, score):ifscore < 0orscore > 100:raiseValueError(’invalid score’)self.__score = score@propertydefgrade(self):ifself.score < 60:return’C’ifself.score < 80:return’B’return’A’s = Student(’Bob’, 59)prints.grades.score = 60prints.grades.score = 99prints.grade8. python中__slots__slots的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。classStudent(object):__slots__ = (’name’, ’gender’, ’score’)def__init__(self, name, gender, score):self.name = nameself.gender = genderself.score = scores = Student(’Bob’, ’male’, 59)s.name = ’Tim’ # OKs.score = 99 # OKs.grade = ’A’ # ErrorclassPerson(object):__slots__ = (’name’, ’gender’)def__init__(self, name, gender):self.name = nameself.gender = genderclassStudent(Person):__slots__ = {’score’}def__init__(self, name, gender, score):super(Student, self).__init__(name, gender)self.score = scores = Student(’Bob’, ’male’, 59)s.name = ’Tim’s.score = 99prints.score9. python中__call__一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()classPerson(object):def__init__(self, name, gender):self.name = nameself.gender = genderdef__call__(self, friend):print’My name is %s...’ % self.nameprint’My friend is %s...’ % friendp = Person(’Bob’, ’male’)p(’Tim’) # My name is Bob... My friend is Tim...classFib(object):def__call__(self, num):a, b, L = 0, 1, []forninrange(num):L.append(a)a, b = b, a + breturnLf = Fib()printf(10) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]来源:博客园

Python学习之定制类

相关内容

    暂无相关文章

评论关闭