Python基础(七)面向对象

Python基础(七)

1、面向对象

1.1、编程范式

  • 面向过程:根据业务逻辑从上到下写代码
    • 强调步骤、过程、如何实现业务。
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象编程(oop):将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
    • 强调由那个对象进行处理,不必由一个对象执行全部的业务代码,可以分配给多个对象完成业务。

1.2、面向对象编程

  • 面向对象:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。
  • 面向对象编程(Object Oriented Programming-OOP):是一种解决软件复用的设计和编程方法。这种方法把软件系统中相近相似的操作逻辑和操作应用、数据、状态,以类的形式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。

1.3、三大特征

  • 封装
    • 封装是将内容封装到某个地方,以后再去调用被封装在某处的内容。
    • 隐藏了对象的属性和实现细节,只对外提供必要的方法。
  • 继承
    • 如果一个新类继承自一个设计好的类,就直接具备了已有类的特征。
    • 继承可以让子类具有父类的特性,提高了代码的重用性。
  • 多态
    • 在面向对象语言中,接口的多种不同的实现方式即为多态。
    • 对同一个方法调用,由于参数或对象的不同可能会产生不同的行为。

2、类和对象

2.1、类

1. 类是什么

  • 类就是一个模板,模板里可以包含多个特征(属性)与行为(方法)

    • 抽出公共的特征归纳为类的属性,信息存储在属性中

    • 归属于类函数称之为方法,在方法中实现一些功能

    • 类其实就是对多个实例抽象化的一个模板,将相同的特征与行为进行归纳

2. 类的组成部分

类(Class)由3个部分构成

  • 类的名称:类名
  • 类的属性:数据
  • 类的方法:允许对进行操作的方法(行为)

2.2、类的定义

1. 定义

'''
定义类 语法:
class 类名:
    属性
    方法
'''


class People:
    name = '张三'
    age = 18
    def say(self):
        print("Hello,word")

2.3、对象

1. 对象是什么

  • 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
    • 对象就是由抽象化的类,通过将类的属性赋值操作,进行实例化的成果
    • 对象具有类的属性与方法

2.4、对象创建

1. 创建

class People:
    name = '张三'
    age = 18

    def say(self):
        print("Hello,word")


'''
创建对象 语法:
对象名=类名()
'''
p1 = People()
print(p1.name)  # 张三
p1.say()  # Hello,word

2.5、self

self和对象指向同一个内存地址,可以认为self就是对象的引用,是实例的本身。

self.__ class __是指向类。

在类中才会有实际的意义,一般作为实例方法的第一个参数,不需要传值,解释器会自动将调用方法的对象传过去。变量名self是约定的,可以进行改变(只是占据第一个参数位)。

class Animal:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def printSelf(self):
        print(id(self))  # 1854650941792
        print(self.__class__)  # <class '__main__.Animal'>

    pass


cat = Animal('cat', 15)
print(id(cat))  # 1854650941792
cat.printSelf()

3、类中方法

3.1、分类

  • 实例方法
  • 类方法
  • 静态方法

3.2、实例方法

实例方法或者叫对象方法,指的是在类中定义的普通方法。

只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身(与参数名无关)。

在某个实例 对象调用方法时python解释器会自动把这个对象作为第一参数传递给self,开发者只需要传递后面的参数即可。

示例:

class People:
    name = '张三'
    age = 18

    def say(self, name, age):
        print(self, name, age)

p1 = People()
p1.say('张三', 20)  # <__main__.People object at 0x000000000268C820> 张三 20

3.3、类方法

无需实例化,可以通过类直接调用的方法,但是方法的第一个参数接收的一定是类本身,在方法上面添加@classmethod进行标识。可以通过类或实例对象调用。

示例:

class People:
    country = 'China'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 类方法
    @classmethod
    def printCountry(cls):
        return cls.country

    @classmethod
    def changCountry(cls, data):
        cls.country = data

    pass


p1 = People("张三", 20)
print(p1.printCountry())  # China
p1.changCountry("测试")
print(p1.printCountry())  # 测试

3.4、静态方法

静态方法由类调用,无默认参数。将实例方法参数中的self去掉,然后在方法定义上方加上@staticmethod,就成为静态方法。它属于类,和实例无关。可以通过类或实例对象调用。

一般只是一些公共方法,不会使用静态方法涉及到类中的方法和属性的操作。

示例:

import time


class myTime:
    @staticmethod
    def showTime():
        return time.strftime("%H:%M:%S", time.localtime())


print(myTime.showTime())  # 21:47:40

4、属性

4.1、分类

  • 类属性(静态属性)
  • 实例属性

4.1、类属性(静态属性)

类内部定义的变量。是在类级别定义的,不是在构造方法__ init __()或其他方法内部定义的,称之为类属性。多个实例对象之间共享一份类属性,可以使用类,或实例对象访问但是只能通过类修改类属性。

4.2、实例属性

在方法内部通过self引用定义出的属性称之为实例属性。(也可以通过对象添加属性)。独立的对象之间的实例属性不互相影响。只能使用实例对象访问。

4.3、示例

class Animal:
    kind = 'animal'  # 类属性

    def __init__(self, age):
        self.age = age  # 实例属性

    pass


print(Animal.kind)  # animal

dog = Animal(20)
dog.name = 'dog'  # 实例属性
print(dog.kind)  # animal
print(dog.age)  # 20
print(dog.name)  # dog

cat = Animal(18)
cat.name = 'cat'  # 实例属性
print(cat.kind)  # animal
print(cat.age)  # 18
print(cat.name)  # cat

5、魔术方法

5.1、概述

在python中,有一些内置好的特定的方法,方法名是“_ _ xxx _ _ ",在进行特定的操作时会自动被调用,这些方法称之为魔法方法。

5.2、常见方法

  • init方法:初始化一个类,在创建实例对象为其赋值时使用。
  • str方法:在将对象转换成字符串str(对象)测试的时候,打印对象的信息。
  • new方法:创建并返回一个实例对象,调用了一次,就会得到一个对象。
  • class方法:获得已知对象的类(对象.__ class __)。
  • del方法:对象在程序运行结束后进行对象销毁的时候调用这个方法,来释放资源。

1. init

触发机制:初始化对象时自动触发

作用:完成一些属性数值的初始化设置

说明:

__ init __(self),初始化方法,实例化对象的时候自动调用,用于完成一些初始化设置。创建新对象时是默认调用的,不需要手动调用。

注意:init方法一个类只能有一个,与Java不同。

class Animal:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    pass

cat = Animal('cat',15)
print(cat.name)  # cat

2. new

触发机制:创建对象时自动触发

作用:完成对象的实例创建

说明:

__ new__(cls, *args, **kwargs)创建实例化方法,cls代表当前的类,也不需要手动传递。

注意:创建对象时会先执行new函数,创建一个对象后执行init函数,与init数据的初始化不同new是对对象的初始化。

class Animal:

    def __init__(self, age):
        self.age = age  

    def __new__(cls, *args, **kwargs):
        print("new函数")
        return object.__new__(cls) # 创建

    pass

3. del

触发机制:析构方法会在对象被销毁时自动触发

作用:关闭一些不用的开发资源

注意:是对象被销毁时触发了这个析构方法,而不是这个析构方法销毁对象

对象会在哪些情况下被销毁

  • 当程序执行完毕,内存中所有的资源都会被销毁释放
  • 使用 del 删除时
  • 对象不在被引用时,会自动销毁
class Animal:

    def __init__(self, age):
        self.age = age

    def __new__(cls, *args, **kwargs):
        print("new函数")
        return object.__new__(cls)

    def __del__(self):
        print("del方法")

    pass


dog = Animal(20)
dog.name = 'dog'
cat = Animal(20)
cat.name = 'cat'
del cat
print("程序结束")
# 输出
# new函数
# new函数
# del方法
# 程序结束
# del方法

4. str

触发机制:打印对象时自动触发

作用:将对象按照定义的方法转换成字符串

注意:使用str方法,需要先在类中定义str方法。

在打印对象时会打印对象的内存地址,自定好str方法后会将对象按照定义的方法转换成字符串。

class Animal:
    kind = 'animal'  # 类属性

    def __init__(self, age):
        self.age = age  # 实例属性

    def __str__(self):  # 定义str方法
        return 'kind is %s age %s ' % (self.kind, self.age)

    pass


print(Animal.kind)  # 类属性

dog = Animal(20)
dog.name = 'dog'  # 实例属性
print(dog.__str__())  # kind is animal age 20
print(dog)  # kind is animal age 20

6、小结

6.1、类和对象的概念

类就是一个模板,模板里可以包含多个属性与函数,属性存储一些数据,函数里实现一些功能;

对象则是根据模板创建的实例,通过实例对象可以执行类中的函数。

6.2、定义类和对象

使用class 语句来创建一个新类,class之后为类的名称并以冒号结尾;
实例化类其他编程语言中一般用关键字new,但是在Python中并没有这个关键字,类的实例化类似函数调用方式。

6.3、实例方法与属性

在类的内部,使用def关键字可以定义一个实例方法

定义在类里面,方法外面的属性称之为类属性

定义在方法里面使用self 引用的属性称之为实例属性

6.4、self

self和对象指向同一个内存地址,self就是对象的引用。

6.5、魔术方法

在python中,有一些内置好的特定的方法,方法名是“_xxx_”,在进行特定的操作时会自动被调用。

posted @ 2022-05-23 17:03  三途河畔人  阅读(305)  评论(0编辑  收藏  举报