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)              返回对象的类型

      

  • 相关阅读:
    mysql 主从复制
    confluence wiki搭建使用
    python 解析json loads dumps
    在linux下修改mysql的root密码
    [转]量子恒道统计
    php include
    php solr 查询
    php solr 扩展
    IKAnalyzer 和 solr4.3 冲突
    solr 4.3.0 配置
  • 原文地址:https://www.cnblogs.com/www-123456/p/10479510.html
Copyright © 2011-2022 走看看