• Python3入门(八)——面向对象OOP


    一、概述

      老生常谈了,万物皆对象。Python作为一门面向对象的语言,也不例外

      直接看一个简单的类定义和实例化类的示例:

    class Student:
        pass
    
    
    stu = Student()

      // pass表示什么也不做

    二、类和实例

      这在Java等OOP语言中也很常见,这里不再赘述:类是抽象的模板,实例是具体的对象

      定义类通过class关键字,后面跟类名,并在类名后通过括号指定从哪个类继承而来。object是所有类的父类:

    class Student(object):
        pass

      实例化则通过类名加括号的形式:

    stu = Student()

      对于需要绑定的属性,可以通过特殊的__init__方法:(Java中通常叫构造器),类属性则直接在类中定义即可。

        其中__init__第一个参数必须是self,用来表示实例本身;后面再在方法内部进行参数绑定:

    class Student(object):
        def __init__(self, name, score):
            self.name = name
            self.score = score

      相应的实例化的时候也需要进行参数绑定:

    stu = Student("张三", 90)

      在Python中也可以在类中定义方法类达到封装数据的效果:

        这里只需要在类中定义方法时传入self,其他和普通函数一样。外部调用时不用传入self,其他也和普通函数一样

    class Student(object):
        def __init__(self, name, score):
            self.name = name
            self.score = score
    
        def print_score(self):
            print("你的成绩是:%s" % self.score)
    
    
    stu = Student("张三", 90)
    stu.print_score()

        静态方法使用注解即可:

    @staticmethod
        def m():
            print("静态方法")

      // 也就是Java中的static了

    三、访问控制

      前面的代码中__init__方法虽然进行了属性绑定,但就像Java中通过Public定义成员变量一样的,外部是可以为所欲为的直接操作变量的

      为了达到Java的private效果,我们通过之前介绍的__双下划线即可实现:

    class Student(object):
        def __init__(self, name, score):
            self.__name = name
            self.__score = score
    
        def print_score(self):
            print("你的成绩是:%s" % self.__score)
    
        @staticmethod
        def m():
            print("静态方法")
    
    
    stu = Student("张三", 90)
    stu.print_score()
    # 使用__后无法直接访问
    # print(stu.name)

      这样只能在内部通过__访问,而外部只能通过相关的公开方法操作了,达到了类似Java中的private的效果

      对应的get set形式如下:

    class Student(object):
        def __init__(self, name, gender):
            self.name = name
            self.__gender = gender
        def get_gender(self):
            return self.__gender
        def set_gender(self, gender):
            self.__gender = gender

      // 后续补充摸索get set的真正写法和快速生成法

    四、继承和多态

      1.继承

        通过继承,可以得到父类的全部功能。当然,子类也具备继承中常见的覆盖override

    class Person(object):
        def __init__(self, name, age):
            self.__name = name
            self.age = age
    
        def run(self):
            print("奔跑吧!")
    
    
    class Man(Person):
        pass
    
    
    man = Man("江北", 18)
    man.run()

      // 更多继承相关,待补充

      2.多态

        多态的概念也不再赘述,这里介绍一下Python中判断类型的方法:

    >>> isinstance(a, list)

        给出一个多态的示例:

    class Person(object):
    
        def run(self):
            print("奔跑吧!")
    
    
    class Man(Person):
        def run(self):
            print("奔跑吧!男生")
    
    
    class Woman(Person):
        def run(self):
            print("奔跑吧!女生")
    
    
    def my_run(p):
        p.run()
    
    
    my_run(Man())
    my_run(Woman())

      当然,从代码可以看到动态语言并不像静态语言(例如Java)一样有严格的继承体系和严格的多态。

      实际上这里的my_run()方法只要接收一个有run()方法的对象即可,它不必非要是Person的子类

    五、获取对象信息

      1.type()

        判断对象类型,使用type()函数

    >>> type(123)
    <class 'int'>

      2.instance()

        判断属于某种类型

    >>> isinstance(p, Person)
    True

      3.dir()

        获取对象的所有属性和方法

    >>> dir('ABC')
    ['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

      仅仅把属性和方法列出来是不够的,配合getattr()setattr()以及hasattr(),我们可以直接操作一个对象的状态:

    >>> hasattr(obj, 'x') # 有属性'x'吗?
    True
  • 相关阅读:
    InitializingBean
    执行jar的记事本
    vue中$forceUpdate()事件
    帆软时间检索限制90天
    vue清楚子组件v-model绑定的值
    Intellij IDEA中启动多个微服务(开启Run Dashboard管理)
    Java将CST的时间字符串转换成需要的日期格式字符串
    axios发送命令如何实现同步
    利用tomcat启动web前端
    vue生命周期
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8932263.html
Copyright © 2020-2023  润新知