zoukankan      html  css  js  c++  java
  • Python学习(十)--类和对象

    一、几个概念
    • 类:代表对象的集合。
    • 对象:对象包括特性和方法。特性只是作为对象的一部分的变量,方法则是存储在对象内部的函数。所有对象都属于某一个类,称为类的实例。
    • 方法:绑定到对象特性上面的函数称为方法。
    • 封装:指向程序中的其他部分隐藏对象的具体实现细节的原则。
    • 继承:一个类可以是一个或者多个类的子类。子类继承超类的所有方法,
    • 子类:当一个对象所属的类是另外一个对象所属类的子集时,前者就被称为后者的子类,后者就是前者的的超类。
     
    二、类
    2.1 创建类
            在创建类之前,先说两个概念。新式类:创建新式类创建必须有一个父类,如果不指定,默认就是继承object。旧式类:没有父对象的的类。在Python3.0以后不存在旧式类,之前的版本,创建类的时候就需要指明继承新式类,在模块或者脚本开始的地方加上__metaclass__ = type。
    class ClassName:
      '类的帮助信息'   #类文档字符串
      class_suite  #类体
            1.通过class语句可以创建一个类。类名通常是大写开头的单词。
            2.和定义函数类似,可以在类名下面加上关于类的帮助信息,通过ClassName.__doc__查看。
     
    2.2 self说明
            类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
    class test:
        def fun1(self):
             xxxx
        def fun2(self, par1, par2):
             xxxx
            self代表的是对象自身,当然你可以取名不叫self,其它命名也可以。通过self,其它成员方法就可以访问要对其特效进行操作的对象本身了。在调用方法时,无需显示的提供self这个参数。
     
    2.3 私有化
            为了让方法或者特性变成私有(从外部无法访问),只要在它的名字前面加上双下划线即可。
    class Test:
       def __fun1(self):
            xxxx
       def fun2(self):
            self.__fun1()
            如上述例子所示,__fun1从外界无法访问,但是在类的内部还是能使用。但是这个并不是真的无法访问,因为带双下划线的名字被_Test_fun1的形式。所以通过test._Test_fun1()形式还是能访问。其实Python中没有绝对的方法保证私有化,只是前面加上下划线可以给出这是私有方法的信号。
            前面带有下划线的名字不会被带星号的import语句(from module import *)导入。
     
    2.4 类的命名空间
            所有位于class语句中的代码都在特殊的命名空间中执行—类命名空间。这个命名空间可以由类内所有成员访问。
     
    2.5 继承
    class Test(object):
            xxxx
            将其他类名写在class语句后面的圆括号里就可以指定超类。继承了超类会继承相应的方法,当然子类也可以重写,在子类里,和超类里同名的方法就会重写超类的方法。
    • issubclass(子类名,父类名):可以检查一个类是否是另外一个的子类。当然也可以通过属性__bases__去查看类的基类
    • isinstance(对象名,类名):可以检查一个对象是否是一个类的实例。可以通过属性__class__查看对象属于哪个类
     
            子类也可以继承多个超类,这叫多重继承。值得注意的是,当继承的多个超类里含有名字相同的方法,先继承的类中的方法会重写后继承的勒种的方法。
    class Test(object1,object2):
            xxxx
     
    2.6 构造方法
            构造方法,当一个对象被创建以后,会立即调用构造方法。
    class Test():
       def __init__(self):
           xxxx
            当新建一个对象test = Test()时就会调用__init__。有了__init__方法,在创建实例的时候就不能传入空的参数,必须传入与__init__方法匹配的参数,但是self不需要传。
            当子类SubTest继承了Test,并且也有构造方法__init__,这样就会重写Test的构造方法,从而失去Test里的一些特性。为了能够继承Test的__init__方法,又能拥有自己特有的部分,可以通过调用超类构造方法的未绑定版本,或者使用super函数。
            1.调用超类构造方法的未绑定版本:
    class Test():
       def __init__(self):
           xxxx
    class SubTest():
       def __init__(self):
           Test.__init__(self)
           xxxx
            2.使用super方法
    class Test():
       def __init__(self):
           xxxx
    class SubTest(Test):
       def __init__(self):
           super(SubTest, self).__init__()
           xxxx
     
     
    2.6 静态方法、类方法、实例方法
    class A(object):
       def m1(self, n):
           print("self:", self)
       @classmethod
       def m2(cls, n):
           print("cls:", cls)
       @staticmethod
       def m3(n):
           pass
    a = A()
        1.实例方法:如m1,第一个参数必须是对象本身,self。对于a.m1是绑定实例对象的方法,直接传参数n的值即可。对于A.m1则是未绑定实例对象的方法,使用时需要将实例对象传入,A.m1(a,x)。
        2.类方法:如m2,第一个参数必须是类本身,cls。a.m2和A.m2都是绑定类对象A。
        3.静态方法:参数没有要求。 静态方法和普通函数没有区别,与类和实例都没有绑定关系。类和实例都可以引用静态方法。
     
    三、一些知识点
    class Person(object):
       address = 'Earth'
       def __init__(self, name):
           self.name = name
    p1 = Person('Bob')
    p2 = Person('Alice')
    print 'Person.address = ' + Person.address
    p1.address = 'China'
    print 'p1.address = ' + p1.address
    print 'Person.address = ' + Person.address
    print 'p2.address = ' + p2.address
    打印结果:
    Person.address = Earth
    p1.address = China
    Person.address = Earth
    p2.address = Earth
     
            原因是 p1.address = 'China'并没有改变 Person 的 address,而是给 p1这个实例绑定了实例属性address ,对p1来说,它有一个实例属性address(值是'China'),而它所属的类Person也有一个类属性address,所以:访问 p1.address 时,优先查找实例属性,返回'China'。访问 p2.address 时,p2没有实例属性address,但是有类属性address,因此返回'Earth'。可见,当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。
     
     
     
     
     
     
  • 相关阅读:
    Docker部署LAMP项目
    Linux学习4-部署LAMP项目
    Docker环境安装
    Python数据库读写
    Python读取和写入Excel文件数据
    Python读取和写入txt,csv文件数据
    Linux学习1-软件测试从业者的高频Linux命令
    Docker的基础命令
    TurtleBot3 MODEL的相应说明
    ROS2 SLAM(同时定位和地图绘制)
  • 原文地址:https://www.cnblogs.com/mujiujiu/p/7833727.html
Copyright © 2011-2022 走看看