设为首页 收藏本站
查看: 871|回复: 0

[经验分享] python入门(八)操作符重定义和继承

[复制链接]

尚未签到

发表于 2017-5-6 08:05:54 | 显示全部楼层 |阅读模式
python入门(八)操作符重定义和继承

参考书籍 python_note_pdq.pdf
13.1 加减法重定义
Python的基本数据类型如整数、浮点数,能够进行数学运算。类可以吗?为了使类的实例也可以进行数学操作,我们需要在类的内部重新定义数学操作符,使之支持用户定义的数据类型。
class RMB:
    def __init__(self,sum=0.0):
        self.sum = sum
    #呵呵,类似于toString()?
    def __str__(self):
        return str(self.sum)
    #重定义加法操作
    def __add__(self,other):
        return RMB(self.sum + other.sum)
    #重定义减法操作
    def __sub__(self,other):
        return RMB(self.sum - other.sum)
a = RMB(2.1)
b = RMB(1.0)
print(a,b,a+b,a-b,a.__add__(b),a.__sub__(b))
控制台输出如下:
2.1 1.0 3.1 1.1 3.1 1.1

13.2 乘法重定义
如果乘法操作符“*”的左右操作数都是用户定义的数据类型,那么调用mul 。若左边的操作数是原始数据类型,而右边是用户定义数据类型,则调用rmul 。
class Rect:
    def __init__(self, width = 0.0, length = 0.0):
        self.width = width
        self.length = length
    def __str__(self):
        return '(' + str(self.length) + ',' + str(self.width) + ')'
    def area(self):
        return self.width * self.length
class Line:
    def __init__(self,length = 0.0):
        self.length=length
    def __str__(self):
        return str(self.length)
    def __mul__(self,other):
        return Rect(self.length,other.length)
    def __rmul__(self,other):
        return Line(self.length * other)
aline = Line(5.87)
bline = 2.9 * Line(8.34) #r表示右边是我们的对象,左边是基本类型
print("aline=",aline," bline=",bline)
rect = aline * bline
print(rect,type(rect))
控制台打印信息:
aline= 5.87  bline= 24.186
(24.186,5.87) <class '__main__.Rect'>

14.1 继承
面向对象程序语言的一个重要特点是继承。继承的子类拥有被继承的父类的所有方法,在此基础上,子类还可以添加自己的专有方法。

14.2 继承的定义
class BaseClass:
    def print(self):
        print("hello world")
class DerivedClass(BaseClass):
    def print(self):
        BaseClass.print(self) #调用父类的方法
a = DerivedClass()
a.print()
控制台打印信息如下:
hello world

14.3 定义一个父类
14.3 继承自以上父类的子类
class Person:
    def __init__(self, name = None, age = 1,sex = "men"):
        self.name = name
        self.age = age
        self.sex = sex
    def displayInfo(self):
        print("name : %-20s" % self.name,"age : %-20d" % self.age,"sex : %-20s" % self.sex)
class Student(Person):
    def __init__(self,name = None,age = 1,sex = "men",grade = 0):
        Person.__init__(self, name, age, sex) #调用父类的构造方法
        self.grade = grade
    def displayInfo(self):
        Person.displayInfo(self)             #调用父类的displayInfo方法
        print("grade : %-20d" % self.grade)
a = Person("sillycat",27,"men")
b = Student("kiko",24,"women",1)
a.displayInfo()
b.displayInfo()
控制台打印信息如下:
name : sillycat             age : 27                   sex : men                 
name : kiko                 age : 24                   sex : women               
grade : 1                  

14.5 私有方法
在Python 中,类的私有方法和私有属性,不能够从类的外面调用。类的方法和属性是公有,还是私有,可以从它的名字判断。如果名字是以两个下划线开始,但并不是以两个下划线结束,则是私有的。其余的都是公有的。
import math
class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
    def __str__(self):
        return '(' + str(self.x) + ',' + str(self.y) + ')'
class Line:
    def __init__(self, p1 = Point(), p2 = Point()):
        self.__p1 = p1 #私有属性
        self.__p2 = p2
    def __str__(self):
        return str(self.__p1) + str(self.__p2)
    def __distance(self): #私有方法
        tx = math.pow(self.__p1.x, 2) + math.pow(self.__p2.x, 2)
        ty = math.pow(self.__p1.y, 2) + math.pow(self.__p2.y, 2)
        return math.sqrt(tx + ty)
    def length(self):
        print(self.__distance())
a = Point(1,2)
b = Point(3,4)
c = Line(a,b)
print(c)
print(c.length())
print(c.__distance())
控制台返回信息:
(1,2)(3,4)
5.47722557505
None
Traceback (most recent call last):
  File "D:\work\easypython\src\com\sillycat\easypython\TestMain.py", line 25, in <module>
    print(c.__distance())
AttributeError: 'Line' object has no attribute '__distance'

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373572-1-1.html 上篇帖子: Python模块包中__init__.py文件的作用 下篇帖子: 轩辕互动面试题目-----最大递增子序列(Python实现)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表