zoukankan      html  css  js  c++  java
  • Python之路【第七篇】:Python基础(23)——面向对象初级

    一、面向对象基础

    • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

    • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

    • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

    • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

    • 实例变量:定义在方法中的变量,只作用于当前实例的类。

    • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许 把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例 图,Dog是一个Animal)。

    • 实例化:创建一个类的实例,类的具体对象。

    • 方法:类中定义的函数。(方法属于类,不属于实例)

    • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

    二、类的定义

     1 class Foo(object): # Foo为类名,括号内的表示是这个类继承自哪个类,这里的object是所有类的基类,一个类可以继承自多个类
     2     '''
     3     类的说明文档,Python会自动将这里面内容赋值给类的变量__doc__
     4     '''
     5     class_var1 = 'var1' # 类的变量,它属于类本身,而不是类的对象,可以通过类名.变量名的方式进行调用,也可以对象.变量名调用,前提是,没有同名的实例变量
     6     def __init__(self, arg, arg2):
     7         '''
     8         初始化方法,有点类似于java语言的构造方法,在创建类的对象的时候自动调用
     9         :param var2: 参数,初始化方法也可以
    10         :return:
    11         '''
    12         self.var2 = arg # 对象的变量,属于对象不属于类,只能通过对象.变量名的方式调用
    13         self.__var3 = arg # 对象的变量,只能在内部调用,不能通过对象.变量名的方式调用,并且不能被继承
    14  
    15     def func1(self, arg):
    16         '''
    17         方法
    18         1、方法属于类(也就是在实例化的时候不会像对象的变量一样单独开辟内存空间)
    19         2、self表示类的对象本身,当我们通过对象名.方法()来调用的时候,解释器会自动将对象作为第一个参数传给方法,方法名.方法(对象名)
    20         :return:
    21         '''
    22         # 方法体,方法体可以通过self.关键字调用对象的变量和方法
    23         self.__var3 = arg # 方法可以调用私有变量和方法
    24  
    25     def __func2(self):
    26         '''
    27         私有方法,和私有变量一样,不能被继承和外部调用
    28         :return:
    29         '''
    30         pass
    31  
    32 class Foo2(Foo):
    33     def __init__(self, arg, arg2):
    34         '''
    35         1、这里调用了父类的初始化方法,特别注意由于“__变量名”表示的私有方法,
    36         2、这里尽管调用了父类的构造方法,__var3变量作为父类的私有方法,子类在没有重新定义之前依然没有这个变量,这点要特别注意
    37         :param arg:
    38         :param arg2:
    39         :return:
    40         '''
    41         super(Foo2, self).__init__(arg, arg2)
    42         self.__var3 = arg2 # 由于__var3是父类的私有方法,尽管调用了父类的初始化方法,子类依然不会有,所以依然需要重新定义

    三、面向对象的三大特征

    1、封装

    封装,就是将内容保存到一个地方,方便调用和修改,比如一个变量封装到一个类中,这样调用类实例化之后,通过对象名.变量名的方式调用和修改变量。

    1 class Role(object):
    2     def __init__(self, name):
    3         self.name = name # 定义一个实例变量
    4     def get_name(self):
    5         return self.name
    6 if __name__ == '__main__':
    7     zhangsan = Role('zhangsan') # 创建实例
    8     print(zhangsan.name) # 调用实例的变量name

    内容被封装到了zhangsan这个变量中,调用的时候直接通过zhangsan这个实例进行调用就可以了

    2、继承

    继承就是,一个类可以通过继承另一个类的方式,拥有另一个类的方法和变量等。和现实中的继承是一样一样的。

    class Role(object):
        def __init__(self, name):
            self.name = name
        def get_name(self):
            return self.name
    class Teacher(Role):
        def __init__(self, name, course):
            '''
            如果父类已经有一个方法,子类也有一个同名的方法,就会覆盖掉父类的方法,专业术语叫做重写
            '''
            super(Teacher, self).__init__(name) # 通过super这种语法可以调用父类的方法和变量,这里调用父类的构造方法,初始化name
            self.course = course # 这个变量是父类所没有的
        def say(self): # 定义父类的
            print('My name is %s, i am a English teather' %self.name)
    if __name__ == '__main__':
        lisi = Teacher('lisi', 'English') # 定义Teacher的实例
        print(lisi.name) # name这个变量是子类通过继承的方式获取的
        print(lisi.get_name()) # 继承自父类的方法
        lisi.say() # 子类特有的方法

    3、多态

    多态是为了接口重用,是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

    Python并不支持多态,并且也用不到多态

  • 相关阅读:
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/jiangnanmu/p/5615920.html
Copyright © 2011-2022 走看看