python类的概念与使用

  1. Python类的使用

    Python 是面向对象的编程语言, 对象不是我们常说的男女对象, 而是编程是为实现某些功能或解决某些问题, 在实现的过程中, 需要将实现过程具体化。 好比现实中某些例子, 如超市购物, 在超市购物的时候, 购买者挑选自己所需的物品并完成支付, 这是一个完整的购物过程。 在这个过程中, 购买者的动作, 如挑选自己物品, 走到收银台完成支付。

    如果使用编程的语言解释这个购物过程, 这个购买过程好比主程序, 购买者可被比喻成一个对象, 购买者的手和脚就是对象的属性或方法。 购买的过程由购买者的手和脚完成, 相当于主程序的代码是由对象的属性或方法来实现。

    类是对象的一个具体描述, 对象的属性和方法都是由类进行定义和设置的。 类主要分为属性和方法, 属性就好比人的姓名、 性别和学历等, 用于对人的描述: 方法就如人的四肢和五宫, 可以实现某些简单的操作。 完整的类定义的语法如下:

     

    class Person(object):
        name = '小黄'
    
        def __init__(self):
            self.age =  '18'
        def foot(self):
            print('普通方法')
        @classmethod
        def class_hand(cls):
            print('类方法')
        @staticmethod
        def static_mouth():
            print('静态方法')
    
    if __name__ == '__main__':
        print('静态属性:',Person.name)
        person = Person()
        print('静态属性:',person.name)
        person = Person()
        print('动态属性:',person.age)
    
        person = Person()
        person.foot()
    
        Person.class_hand()
        person = Person()
        person.class_hand()
    
        Person.static_mouth()
    
        person = Person()
        person.static_mouth()
    

      

    类的定义由关键词 class 实现, 关键词 class后面为类名, 这个可以自定义命名;类名后面是一个小括号和object类,这是 Python 的新式类。 Python 的类分为新式类和经典类, 经典类在日常开发中不建议使用, 现在都是使用新式类进行定义。 有关 Python 的新式类和经典类此处不做详细讲述, 有兴趣的读者可以自行研究。

    在上述类的定义语法中,Person 类定义了类的属性和方法, 类属性又分为静态属性和动态属性;类的方法分为普通方法、类方法和静态方法。静态属性和动态属性的最大区别在于使用方式的不同,前者具备两种使用方式,后者需要将类实例化后才能使用。普通方法、类方法和静态方法也是如此,前者只能实例化后才能使用,后两者具备两种使用方式。

    在类定义中,我们留意到关键词 self,这个关键字代表类本身,这也说明带有 self的变量或方法是当前类所定义的动态属性或方法。代码运行结果如图所示。

     

    在定义类的时候,类会自动生成许多内置方法。 如代码中的 _init_ 初始化方法,类在实例化的时候, 首先自动执行 _init_ 初始化方法。 上述的Person类是自定义类的初始化方法, 如果在定义类的时候,没有特殊要求,可以不用重写初始化方法。如果在初始化方法里面设置类的参数,在调用类的时候, 类的实例化也应设置相应的参数。 具体的使用方式如下述代码所示:

    class Person(object):
    
        def __init__(self, name):
            self.name = name
    
    if __name__ == '__main__':
        person = Person('小黄')
        print(person.name)

     

    上述代码演示了__int__初始化方法的使用方式,在实际的开发中,是否重写初始化方法应根据功能实现方式决定。此外,类还具有以下的常用的内置方法,如下表

    类的使用在上述例子中有所提及,在调用类的属性和方法之前,建议将类实例化后在使用。类的实例化也称为对象,类在实例化之后,可以直接调用类的属性或方法来实现某些功能或者操作,这就是面向对象的编程思想。

     

  2. 类的封装

    封装在我们日常生活中都能看到和接触到, 比如在使用支付宝进行付款的时候, 只需要把二维码给收款方或扫下收款方提供的二维码就可以完成支付, 无需知道程序如何解析二维码以及资金的交易流向, 其整个支付功能就可以理解为是经过封装处理。 从这个例子得知, 封装是将程序中某些功能的执行过程写到函数或类里面, 当程序调用函数或类时即可实现程序的功能。

    Python 的类可以分成两层封装, 类在实例化时所生成的对象看作一个己经封装好的对象,调用对象的属性或方法来实现某些功能, 这是类的第一层封装。有时候需要把类里面的某些属性或方法封装起来, 将其设置为类的私有属性或方法, 使得这些属性和方法只能 在类的内部使用, 无法在类的外部调用, 这是类的第二层封装。

    对于类的第一层封装, 相信读者在上节中有所了解,本节就不再讲述。 类的第二层封装主要是将类的属性或方法设置为私有,只允许在类的内部使用。 定义私有属性或方法只需要在属性名和方法名之前加双下划线即可, 具体的代码如下:

     

    class Person(object):
    
    
        def __init__(self, name):
            self.__name = name
            self.age = 10
    
        def __get_age(self):
    
            return self.age
    
        def get_name(self):
            return self.__name
    
    if __name__ == '__main__':
        p = Person('Lili')
         print('公有属性age的属性值:', p.age)
         print('公有方法get_name的返回值:', p.get_name())
         print('强制读取私有属性,属性值:', p.Person__name)
         print('强制调用私有方法,返回值:', p._Person__get_age())
    

     

      

     

    上述代码分别定义私有属性_name、公有属性 age、私有方法_get_age 和普通方法 get_name。在主程序中,将类实例化生成对象 p,然后对象 p 只能获取公有属性age的属性值和调用公有方法 get_name,如果对象 p i周用私有属性_nam和私有方法_get_age,程序会提示 AttributeError: 'Person' object has no attribute '_name,等错误信息。但这并不代表无法 在类的外部读取私有属性和调用私有方法, 可以使用强制性的方式来获取私有属性和调用私有方法, 如 p._Person_ name 或 p._Person_get_age(), 但在日常开发中,则不提倡这种强制性的操作方式。 代码运行结果如图所示

     

  3. 类的继承

    继承常用于父母与子女之间, 比如子女的外貌长得像父母, 这是因为子女的基因是来 自于父母。 编程语言中的继承也是如此, 比如在定义 Student 类的时候, 可以使 Student 类继承 Person 类, 使得子类 Student 拥有父类 Person 的所有属性和方法, 而且子类 Student可重写父类的属性和方法或自定义新的属性和方法。 下面通过示例来说明类的继承:

     

    class Person(object):
    
        def __init__(self, name):
            self.__name = name
            self.age = 10
    
        def __get_age(self):
            return self.age
    
        def get_name(self):
            return self.__name
    
    class Student(Person):
        def student_name(self):
            return self._Person__name
    
    if __name__ == "__main__":
        s = Student('Lucy')
        print('调用父类的普通方法:', s.get_name())
        print('调用父类的私有方法:', s._Person__get_age())
        print('这是Student类的名字:', s.student_name())
    

      

     

     

    从子类 Student 的定义来看, 类名 Student 后面的小括号里 Person 是指向父类 Person, 这是将 Student 类继承 Person 类, 如果 Student 类需要继承多个类, 可以在小括号里填写,每个类之间使用英文格式的逗号隔开。 在子类 Student 里面, 只是定义了普通方法归student_name,由于它的父类是Person,因此它还具有父类的属性_name 和 age、父类的方法_get_age和get_name。

    在主程序中, 子类 Student 首先实例化生成对象 s,在实例化时需要设置参数, 因为子 类 Student 继承了父类 Person 的初始化方法 _init_ 。对象 s可以调用 Student 所有的属性和方法, 对于父类的私有属性和私有方法可以使用强制性的操作方式来实现。 代码运行结果如图所示。

posted @ 2021-11-26 17:45  头发重要  阅读(870)  评论(0编辑  收藏  举报