1、类的使用

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

class Person(object):
    # 定义静态属性
    name = '小黄'
    # 定义动态属性
    def __init__(self):  # __init__是类的初始化方法
        self.age = '18'
    # 定义普通方法
    def foot(self):  # 至少有一个selef参数
        print('这是我的脚,由普通方法实现')
    # 定义类方法,由classmethod装饰器实现
    @classmethod
    def class_hand(cls):  # 至少有一个cls参数
        print('这是我的手,由类方法实现')
    # 定义静态方法,由staticmethod装饰器实现
    @staticmethod
    def static_mouth():  # 无默认参数
        print('这是我的嘴,由静态方法实现')
if __name__ == '__main__':
    # 获取静态属性
    # 方法1,直接调用
    print('静态属性:',Person.name)
    # 方法2,实例化后再调用
    person = Person()
    print('静态属性:',person.name)

    # 获取动态属性
    person = Person()
    print('动态属性:', person.age)

    # 调用普通方法
    person = Person()
    person.foot()

    # 调用类方法
    # 方法1,直接调用
    Person.class_hand()
    # 方法2,实例化后再调用
    person = Person()
    person.class_hand()

    # 调用静态方法
    # 方法1,直接调用
    Person.static_mouth()
    # 方法2,实例化后再调用
    person = Person()
    person.static_mouth()

执行结果:

静态属性: 小黄
静态属性: 小黄
动态属性: 18
这是我的脚,由普通方法实现
这是我的手,由类方法实现
这是我的手,由类方法实现
这是我的嘴,由静态方法实现
这是我的嘴,由静态方法实现

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

如果在初始化方法里面设置类的参数,在调用类的时候,类的实例化也应设置相应的参数。具体的使用方式如下述代码所示:

class Person(object):
    def __init__(self,name):  # 重写__init__并设置实例化参数name
        self.name = name
if __name__ == '__main__':
    person = Person('小黄')  # 实例化时必须设置name参数值
    print(person.name)

2、类的封装

封装是将程序中某些功能的执行过程写到函数或类里面,当程序调用函数或类时即可实现程序的功能。
将类的属性或方法设置为私有,只允许在类的内部使用。定义私有属性或方法只需要在属性名和方法名之前加双下划线即可,具体的代码如下:

class Person (object):
    # 定义私有属性name和公有属性age
    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('LiLy')
    # 读取共有属性和普通方法
    print('公有属性age的属性值:',p.age)
    print('共有方法get_name的返回值:',p.get_name())
    # 强制读取私有属性和调用私有方法
    print('强制读取私有属性,属性值:',p._Person__name)
    print('强制读取私有方法,返回值:',p._Person__get_age())

3、类的继承

子类拥有父类的所有属性和方法,而且子类可重写父类的属性和方法或自定义新的属性和方法

# 定义父类Person
class Person (object):
    # 定义私有属性name和公有属性age
    def __init__(self,name):
        self.__name=name
        self.age = 10
    # 定义私有方法
    def __get_age(self):  # 方法名前加双下划线
        return self.age
    # 定义普通方法
    def get_name(self):
        return self.__name

# 定义子类Student
class Student (Person):
    # 自定义普通方法
    def student_name(self):
        # 继承Person,通过强制操作方式来获取父类的私有属性
        return self._Person__name
    
if __name__ == '__main__':
    s=Student('Lucy')
    # 调用父类的普通方法get_name
    print('调用父类的普通方法:',s.get_name())
    # 调用父类的私有方法
    print('调用父类的私有方法:', s._Person__get_age())

如果Student类需要继承多个类,可以在小括号里填写,每个类之间使用英文格式的逗号隔开。在子类Student里面,只是定义了普通方法student_name,由于它的父类是Person,因此它还具有父类的属性__name和age、父类的方法__get_age和get_name。
子类可以重写父类的同名方法,重写以后,父类的方法并不会改变,但是子类在调用该方法的时候自动调用重写后的方法。