zoukankan      html  css  js  c++  java
  • python学习笔记(六)、类

    博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

      Python与java、c++等都被视为一种面向对象的语言。通过创建自定义类,用于处理各种业务逻辑。面向对象有封装、继承、多态三个特征,这也是面子对象语言的通用特征。

    1 封装

      封装,是值向外部隐藏内部不必要的具体实现。

    2 继承

      继承,是值通过一次创建类,而以后再次创建的类与该类的方法有重合的,可以使用继承,这样就避免了再次编写,减少了代码的冗余。python支持多继承。

    3 多态

      多态,值能够同样的对不同的类型的对象调用相同的方法。

    4 类

      类,表示一组对象,每个对象都属于特定的类。如果一个类B继承了A类,辣么A类就称为B类的超类,B类超为A类的子类

      4.1 类的创建

      python通过关键字class来创建类。如:

      __metaclass__ = type  #如果你使用的python 2,创建类时请包涵这行代码

      class Person:

        num = 0  #num表示类属性(关于类属性和对象属性等下会讲解)

        def set_name(self,name):

          self.name = name

        def get_name(self):

          return self.name

      这样一个类就定义好了。类的主要任务是定义其实例将要包含的方法。不知道小伙伴们注意到没,这上面的每个方法都包含一个self参数,这个参数有什么用?表示什么呢?   在python中,对于类中定义的方法,都会对有一个参数自动传递给它们,该参数是指向对象本事的,在调用的时候不必传入该值,一般将其命名为self。显然,如果方法没有self参数,辣么将无法访问对象本身。

      4.2 属性(类属性、对象属性)

      属性主要分为类属性和对象属性,也可叫为全部属性和局部属性。这两个属性主要区别是作用域不用,类属性将关联到类上,任何对象调用该属性,将访问到同一地址空间,对象属性知名其意,就是将属性关联到对象,与类无关,每个对象对其访问修改不会影响其他对象的值。如:

      # 上面的Person类中,num表示类属性,name为对象属性

      person1 = Person()

      person2 = Person()

      Person.num = 100

      print(person1.num)  ——> 100
      print(person2.num)  ——> 100

      person1.set_name('小明')
      person2.set_name('小张')

      print(person1.get_name())  ——> 小明
      print(person2.get_name())  ——> 小张

      类属性必须对其修改必须使用  类名.属性名  来进行修改,访问可使用 类名.属性名 或者 对象名.属性名

      4.3 封装

      在python中,要让方法或属性成为私有的(不能从外部直接访问),只需让其名称以两个下划线打头即可。如:__name、__accessible(self)。虽然以两个下划线打头有点儿怪异,但这样的方法类似与其他语言中的私有方法(如java中的private)。然而,幕后的处理手法却不怎么引人入目:在类定义中,对所有以两个下划线打头的名称都进行相应转换,即在开头加上一个下划线和类名。即你可以这样调用方法__classname__accessible(),但是并不应该这样做。

      总之,你无法禁止别人访问对象的私有方法和属性,但这种名称修改方式发出了强烈的信号,让他们不要这样做。

      如果你不希望名称被修改,有想发出不要从外部修改属性或方法的信号,可用一个下划线打头。这虽然只是一种约定,但也有作用。例如,from modul import *不会导入以一个下划线打头的名称。

      4.4 继承

      python通过在class语句中的类名后加上超类名,并用圆括号()包括,多个超类用逗号 ( , ) 隔开。在一个类中,如果一个类有多个超类以不同方式实现了同一个方法(即有多个同名的方法),必须在class语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面的类的该方法。

      class PersonA(Person):

        pass

      class PersonB(PersonA, ..., ....):

        pass

      要确定一个类是否是另一个类的子类,可用内置方法issubclass(classname1, classname2)

      要想知道一个类的基类,也就是超类,可访问特殊属性__bases__。

      要想知道一个对象是否是该类的实例,可使用isinstance(obj1, classname)

      要想知道一个对象属于哪个类,可使用特殊属性__class__。

    5 抽象基类

      抽象基类是不能实例化的类,即不能创建该类对象,其最大职责是定义子类应该实现的一组抽象方法。如:

      from abc impot ABC, abstractmethod

      class Person(ABC):

        @abstractmethod

        def a(self):

          pass

    6 相关方法

      getattr(obj, name[, default])     获取属性的值,可提供默认值

      setattr(obj, name, value)         将对象的指定属性设置为指定的值

      type(object)              返回对象的类型

      

  • 相关阅读:
    day7 面向对象 静态方法 类方法 属性方法 类的特殊成员方法 元类 反射 异常处理
    day6 面向对象 封装 继承 多态 类与实例在内存中的关系 经典类和新式类
    day5 time datetime random os sys shutil json pickle shelve xml configparser hashlib subprocess logging re正则 python计算器
    kafka常用操作命令
    linux基础
    django学习1——初识web应用程序
    mysql数据库(三)——pymysql模块
    mysql数据库(二)——表的查询
    mysql数据库(一)
    Python常用模块——re模块
  • 原文地址:https://www.cnblogs.com/www-123456/p/10479510.html
Copyright © 2011-2022 走看看