zoukankan      html  css  js  c++  java
  • python类的继承和多态

    python类的继承和多态

    现在属于是老年人的脑子,东西写着写着就忘了,东西记着记着就不知道了。之前学C++的时候就把类、对象这块弄得乱七八糟,现在是因为很想玩python,所以就看看python的类和对象。

    就像说的,类有三个特征:封装、继承、多态。

    1、封装:类封装了一些方法,可通过一定的规则约定方法进行访问权限。

    C++中的成员变量有public、private、ptotected。

    在python中,默认的成员变量都是public的,如果成员变量前面是加两个下划线,表示该成员变量是私有的。并且private类不能被继承类引用,并且不允许直接访问。

    2、继承:在定义一个类的时候可以从当前有的类中进行继承。

    python是允许多继承的,并且在子类中拥有父类所有的成员变量和方法,为了缓解代码中的冗余,子类在父类的基础上增加的成员变量可以如下修改。

    复制代码
    class Person(object):
        def __init__(self,name,sex):
            self.name = name
            self.sex = sex
    
    class Child(Person):                          # Child 继承 Person
        def __init__(self,name,sex,mother,father):
            Person.__init__(self,name,sex)        # 子类对父类的构造方法的调用
            self.mother = mother
            self.father = father
    
    May = Child("May","female","April","June")
    print(May.name,May.sex,May.mother,May.father)
    复制代码

    3、多态:当子类继承父类之后,成员方法既可以重写也可以不重写。当调用的时候只要保证新方法编写正确,不用管原来的代码。

    •     对扩展开放(Open for extension):允许子类重写方法函数
    •     对修改封闭(Closed for modification):不重写,直接继承父类方法函数

    python是一种动态语言,动态语言是在运行的时候确定数据类型的语言。变量在使用前不用声明,通常变量的类型是被复制的那个值的类型。

    静态语言是在编译的时候变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前鼻血声明数据类型。

    在类中,当要对成员变量进行约束的时候可以使用@property,python内置的@property装饰器是负责把一个方法变成属性调用

    在实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。还可以定义只读属性,只定义getter方法不定义setter就是一个只读属性

    请利用@property给一个Screen对象加上widthheight属性,以及一个只读属性resolution

    复制代码
    class Screen(object) :
        @property
        def width(self) :
            return self._width
    
        @width.setter
        def width(self,valuer) :
            if not isinstance(valuer,int):
                raise ValueError('score must be an integer')
            if valuer < 0 :
                raise ValueError('score must over zero')    
            self._width=valuer
    
        @property
        def height(self) :
            return self._height
    
        @height.setter
        def height(self,number) :
            if not isinstance(number,int) :
                raise ValueError('score must be an integer')
            if number < 0 :
                raise ValueError('score must be an zero')
            self._height = number
    
        @property
        def resolution(self):
            return self._width * self._height
    
    s=Screen()
    s.width = 1024
    s.height = 768
    print(s.resolution)
  • 相关阅读:
    LINQ使用的一点心得 子曰
    Extjs的grid的单元格中加载超链接和按钮 子曰
    关于建立“高保真模型”的必要性 子曰
    DHL:jQuery框架学习使用总结,插件,继续中...
    dhl:mvc用户登陆身份验证
    thickbox.js 及 将thickbox "close or esc key "改为 中文"关闭"
    在 jQuery 中如何判断对象是否存在
    jquery弹出层实例
    dhl:jquery select下拉框,checkbox,选择
    asp.net mvc 中"未找到路径“/favicon.ico”的控制器或该控制器未实现 IController。"
  • 原文地址:https://www.cnblogs.com/chargeworld/p/12261609.html
Copyright © 2011-2022 走看看