zoukankan      html  css  js  c++  java
  • 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) 
  • 相关阅读:
    Codeforces Round #592 (Div. 2)C. The Football Season(暴力,循环节)
    Educational Codeforces Round 72 (Rated for Div. 2)D. Coloring Edges(想法)
    扩展KMP
    poj 1699 Best Sequence(dfs)
    KMP(思路分析)
    poj 1950 Dessert(dfs)
    poj 3278 Catch That Cow(BFS)
    素数环(回溯)
    sort与qsort
    poj 1952 buy low buy lower(DP)
  • 原文地址:https://www.cnblogs.com/chenyang920/p/7838158.html
Copyright © 2011-2022 走看看