类的基本定义方法

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。如人类,动物类。
  • 对象:通过类定义的数据结构实例,如某个人,某个人养的宠物,某个人的男(女)对象
  • 类的定义方法,通过class方法定义
  • 类的名称,通常为首字母大写
class Person:
    """
    定义一个类,即人类
    """
    pass


xiao_ming = Person()  # 小明是人类的具体的一员,类的实例即对象
  • 方法:类中定义的函数

  • self代表类的实例,而非类。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

class Person:
    """
    定义一个类,即人类
    """
    def eat(self):
        print('我在吃饭中')


xiao_ming = Person()  # 小明是人类的具体的一员,类的实例即对象
xiao_ming.eat()  # 小明属于人类,具有吃饭的方法
  • 类变量:类变量在整个实例化的对象中是公用的。
  • 类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
class Person:
    """
    定义一个类,即人类
    """
    name = '小明'

    def eat(self):
        print('我在吃饭中'.format(self.name))  # 子函数想要调用类变量必须用self调用类属性,self为对象实例化,self.name即实例对象的属性
        print('我在吃饭中'.format(Person.name))  # 也可以使用类名称调用类属性


xiao_ming = Person()  # 小明是人类的具体的一员,类的实例即对象
xiao_ming.eat()  # 小明属于人类,具有吃饭的方法
"""
我在吃饭中
我在吃饭中
"""
  • 类变量如果要用实例对象调用,建议用self调取属性

构造函数

  • __init__函数:在对象实例化的时候自动调用的函数。
class Person:
    """
    定义一个类,即人类
    """
    def __init__(self):
        print('我正在初始化')


xiao_ming = Person()  # 实例化的时候,init函数自动调用
"""
我正在初始化
"""
  • __init__函数里面的参数决定了对象实例化的时候需要给什么参数。
class Person:
    """
    定义一个类,即人类
    """
    def __init__(self, name):
        print('我正在初始化')


p = Person('小明')  # 必须要提供name对象,这里是self=p,name='小明'
"""
我正在初始化
"""

继承与多继承

  • 一个类可以属于另外一个类,如学生属于人类,人类属于动物。
  • 父类的方法和属性可以被其子类继承。
  • 定义类的使用使用括号代表继承关系
  • python中所有的类都属于object
  • 示意图如下:箭头代表继承过程,实线代码本身具有的方法,虚线代表继承来的方法。

image-20200520144724721

  • 用python实现如下:
class Animal(object):
    """
    定义一个动物类,继承于object
    """
    def __init__(self, age):
        """
        初始化构造函数,需要给年龄
        :param age:
        """
        pass

    def eat(self):
        print("我正在吃饭")


class Person(Animal):
    """
    定义一个人类,继承于动物
    """

    def study(self):
        """
        定义一个学习方法
        :return:
        """
        print('我在学习')


class Student(Person):
    """
    定义一个学生类,继承于人类
    """

    def test(self):
        """
        定义一个方法,名为考试
        :return:
        """
        print('我在考试')


xiao_ming = Student(18)  # 这里必须要给age
# 如果类自身没有的函数,就会去它的父类寻找。
# 父类找不到,就去找爷爷
# 如果子类自己有的函数,父类也有的话,优先用子类的
xiao_ming.test()
xiao_ming.study()
xiao_ming.eat()
"""
我在考试
我在学习
我正在吃饭
"""
  • 一个类也可以继承多个类
class Worker(object):
    """
    定义一个工人类
    """

    def working(self):
        print('我在工作')

    def make_money(self):
        print('我能挣钱')


class Man(object):
    """
    定义一个男性类
    """
    pass


class Father(Worker, Man):
    """
    定义一个类,名为父亲
    继承自工人和男性
    """

    def take_care_of_a_child(self):
        """
        父亲需要带孩子
        :return:
        """
        print('我在带孩子')


f = Father()
f.make_money()
f.take_care_of_a_child()
f.working()
"""
我能挣钱
我在带孩子
我在工作
"""

类的三种属性或者方法

  • 私有:两个左下划线开头,不可被继承,不可以被外部访问(比如女性的年龄)
  • 保护:一个下划线开头,可继承,可外部实例访问(比如你的支付宝余额)
  • 公开:普通属性和方法就是公开的。
class Person(object):
    __age = 18  # 定义类的私有属性,不可继承,不可外部访问
    _money = 0  # 定义保护属性, 可以继承,不可外部访问


class Student(Person):
    def __init__(self, name):
        self.name = name  # 定义公开属性
        print('该学生的余额为:', self._money)  # 打印学生的余额


stu = Student('小明')
print(stu.name)
print(stu._money)  # 保护属性,不会报错
print(stu.__age)  # 私有,会报错
"""
该学生的余额为: 0
小明
0
Traceback (most recent call last):
  File "/home/tlntin/PycharmProjects/study/01.py", line 15, in <module>
    print(stu.__age)  # 会报错
AttributeError: 'Student' object has no attribute '__age'
"""

方法重写

  • 如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法。
  • 简单来说就是在调用子类方法的同时,调用父类的方法,实现方法重写。
class Father(object):

    def __init__(self):
        print('这是父类的初始化')


class Son(Father):
    def __init__(self):
        """
        如果子类初始化的同时,调用父类的初始化
        """
        Father.__init__(Son)  # 这里必须要给一个参数,因为类还没有实例化,所以必须把类当做对象放进去
        print("这是子类的初始化")

s = Son()
  • 如果不能直接改动类的源代码,可以使用super函数实现方法重写
class Father(object):

    def __init__(self):
        print('这是父类的初始化')


class Son(Father):
    def __init__(self):
        """
        如果子类初始化的同时,调用父类的初始化
        """
        print("这是子类的初始化")


s = Son()
super(Son, s).__init__()  # 调用s的超类的构造函数
"""
这是子类的初始化
这是父类的初始化
"""
最后修改日期:2020年9月15日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。