Python-面向对象-类与对象

174 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

1. 类:

类是多个类似事物组成的群体的统称,能够帮助我们快速理解和判断事物的性质。(相当于制造飞机的图纸/模板)

换句话说:类是一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用。类的职责就是负责创建对象的。

  • 特征被称为属性
  • 行为被称为方法

类的名称(类名):由一个或者多个单词组成。

起名规范:单词首字母大写,其余小写。例如Student

1.1 类(class)的组成

类属性:直接写在类里的变量称为类属性,类中方法外的变量称为类属性,被该类的所有对象所共享

实例方法:在类之内定义的函数称为方法,在类之外定义的函数称为函数

静态方法:使用staticmethod修饰的,为静态方法,使用类名直接访问的方法

类方法:由classmethod进行修饰,是类方法,使用类名直接访问的方法

class Student:
    native_pace = '类属性'  # 直接写在类里的变量,称为类属性
    def __init__(self, name, age):  # 初始化方法
        # self.name 称为实例属性,进行了一个赋值操作,将局部变量的name的值赋值给实例属性
        self.name = name
        self.age = age

    # 实例方法
    def eat(self):
        print('这是实例方法')

    # 静态方法
    @staticmethod
    def method():
        print('这里使用了staticmethod进行修饰,所以是静态方法')

    # 类方法
    @classmethod
    def cm(cls):
        print('这里使用了classmethod进行修饰,所以是类方法')

1.2 类的设计

在使用面向对象开发前,应该首先分析需求,确定一下,程序中需要包含哪些类。

在程序开发中,要设计一个类,通常需要满足以下三个要素(类的三要素):

  1. 类名:这类事物的名字,取名规则为大驼峰命名法(每一个单词的首字母大写,单词之间没有下划线)
  2. 属性:这类食物具有什么样的特征
  3. 方法:这类食物具有什么样的行为

注意:对于在需求中没有涉及到的属性或者方法,在涉及类时不需要考虑。

2. 对象:

2.1 面向过程

  1. 把完成某一个需求的所有步骤从头到尾逐步实现
  2. 根据开发需求,将某些功能独立的代码封装成一个又一个函数
  3. 最后完成的代码,就是顺序地调用不同的函数 特点:
  • 注重步骤与过程,不注重职责分工
  • 如果需求复杂,代码会变得很复杂
  • 开发复杂项目,没有固定的套路,开发难度大
  • 牵一发而动全身,想要修改一个函数可能还需要改很多函数

2.2 面向对象

  1. 在完成某一个需求前,首先确定职责,即要做的事情(方法)
  2. 根据职责确定不同的对象,在对象内部封装不同的方法(多个)
  3. 最后完成的代码,就是顺序地让不同的对象调用不同的方法

注:面向对象相比于面向过程是一种更大的封装。需要把多个功能独立的代码封装到多个方法中,还要把多个方法封装到对象中。

特点:

  • 注重对象和职责,不同的对象承担不同的职责
  • 更加适合应对复杂的需求变化,是专门硬对复杂的项目开发,提供的固定套路
  • 需要在面向过程的基础上,再学习一些面向对象的语法

PythonPython 中一切皆是对象。所谓对象,就是由(图纸/模板)创建出来的一个具体存在(飞机),可以直接使用。

  • 由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。
  • 程序开发时,应该先有类,再有对象。
  • 类只有一个,而对象可以有很多个。
  • 不同对象之间的属性可能会各不相同。
  • 类中有什么样的属性和方法,创建出来的对象就有生么样的属性和方法。

3. 使用方式:

类属性、类方法、静态方法等的使用方式如下:

  • 实例方法属性:对象名.实例方法属性名,例如 stu1.name
  • 类属性:对象名.类属性名,例如 stu1.native_pace
  • 类方法:类名.类方法名,例如 Student.cm()
  • 静态方法:类名.静态方法名,例如 Student.method()

实例方法:

  • 调用方法1:对象名.方法名,例如 stu1.eat()
  • 调用方法2:类名.方法名(类的对象),例如 Student.eat(stu1)
# 1 创建Student类的对象
# 1.1 调用方式一
stu1 = Student('张三', 23)
stu1.eat()               # 对象名.方法名
print('学生姓名', stu1.name)
print('学生年龄', stu1.age)

# 1.2 调用方式二
Student.eat(stu1)  # 类名.方法名(类的对象)
print('学生姓名', stu1.name)
print('学生年龄', stu1.age)

# 2 类属性的使用方式
stu1 = Student('张三', 20)
stu2 = Student('李四', 30)
print('stu1.native_pace: ', stu1.native_pace)   # 访问类属性
print('stu2.native_pace: ', stu2.native_pace)

# 3 调用类方法
Student.cm()

# 4 调用静态方法
Student.method()

4. 动态绑定:

PythonPython 是动态语言,在创建对象之后,可以动态绑定属性和方法。

动态绑定的属性和方法,只针对当前对象起作用。

# 5 动态绑定属性
stu2.gender = '女'   # 为stu2动态绑定性别属性,该属性只适用于当前绑定的这个对象
print('学生2:', stu2.name, '\n年龄', stu2.age, '\n性别', stu2.gender)

# 6 动态绑定方法
def show():
    print('定义在类之外的,称为函数')

stu1.show = show    # 为stu1动态绑定方法
stu1.show()

5. 全部代码:

class Student:
    native_pace = '类属性'  # 直接写在类里的变量,称为类属性
    def __init__(self, name, age):  # 初始化方法
        # self.name 称为实例属性,进行了一个赋值操作,将局部变量的name的值赋值给实例属性
        self.name = name
        self.age = age

    # 实例方法
    def eat(self):
        print('这是实例方法')

    # 静态方法
    @staticmethod
    def method():
        print('这里使用了staticmethod进行修饰,所以是静态方法')

    # 类方法
    @classmethod
    def cm(cls):
        print('这里使用了classmethod进行修饰,所以是类方法')

# 1 创建Student类的对象
# 1.1 调用方式一
stu1 = Student('张三', 23)
stu1.eat()               # 对象名.方法名
print('学生姓名', stu1.name)
print('学生年龄', stu1.age)

# 1.2 调用方式二
Student.eat(stu1)  # 类名.方法名(类的对象)
print('学生姓名', stu1.name)
print('学生年龄', stu1.age)

# 2 类属性的使用方式
stu1 = Student('张三', 20)
stu2 = Student('李四', 30)
print('stu1.native_pace: ', stu1.native_pace)   # 访问类属性
print('stu2.native_pace: ', stu2.native_pace)

# 3 调用类方法
Student.cm()

# 4 调用静态方法
Student.method()

# 5 动态绑定属性
stu2.gender = '女'   # 为stu2动态绑定性别属性,该属性只适用于当前绑定的这个对象
print('学生2:', stu2.name, '\n年龄', stu2.age, '\n性别', stu2.gender)

# 6 动态绑定方法
def show():
    print('定义在类之外的,称为函数')

stu1.show = show    # 为stu1动态绑定方法
stu1.show()