python类和对象

什么是对象?

  • 对象=属性1+方法2
  • 对象:类并不能直接使用,通过类创建出的实例(又称对象)才能使用。这有点像汽车图纸和汽车的关系,图纸本身(类)并不能为人们使用,通过图纸创建出的一辆辆车(对象)才能使用。

什么是类?

  • 类:可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的 Turtle表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。
  • 例如创建乌龟这个类
class Turtle:
    bodyColor = "绿色"
    footNum = 4
    weight = 10
    hasShell = True
    #会爬
    def crawl(self):
        print("乌龟会爬")
    #会吃东西
    def eat(self):
        print("乌龟吃东西")
    #会睡觉
    def sleep(self):
        print("乌龟在睡觉")
    #会缩到壳里
    def protect(self):
        print("乌龟缩进了壳里")

面向对象编程(Object-oriented Programming,简称 OOP)

  • 面向对象的三大特征——封装3、继承4和多态5
  • 定义类——
class 类名:  
多个(≥0)类属性…  
多个(≥0)类方法…

注意,无论是类属性还是类方法,对于类来说,它们都不是必需的,可以有也可以没有。另外,Python 类中属性和方法所在的位置是任意的,即它们之间并没有固定的前后次序。

Python类对象的创建和使用

Python类的实例化

对已定义好的类进行实例化,其语法格式如下:

#类名(参数)
turtle1=Turtle()

python可以动态添加类对象的属性和方法

def say_hi(self):  
    print("Hi, my name is " + turtle.name)  
turtle.say_hi = say_hi  
turtle.say_hi(turtle)

注:动态添加的属性和方法只属于该对象别的实例化对象不能使用

self 的用法

  • 那么,self 参数的具体作用是什么呢?打个比方,如果把类比作造房子的图纸,那么类实例化后的对象是真正可以住的房子。根据一张图纸(类),我们可以设计出成千上万的房子(类对象),每个房子长相都是类似的(都有相同的类变量和类方法),但它们都有各自的主人,那么如何对它们进行区分呢?当然是通过 self 参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。

Python类变量和实例变量(类属性和实例属性)

  1. 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量
  2. 类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量
  3. 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量

类变量(类属性)

  • 类变量指的是在类中,但在各个类方法外定义的变量。举个例子:
class Turtle:  
    name="Mike"  
    color="black"  
    legs=4  
    def  __init__(self,name,color,legs):  
        self.name=name  
        self.color=color  
        self.legs=legs

上述代码中namecolorlegs就是类变量

  • 类变量的特点是:所有类的实例化对象都同时共享类变量,也就是说,类变量在所有实例化对象中是作为公用资源存在的。类方法的调用方式有 2 种,既可以使用类名直接调用,也可以使用类的实例化对象调用
    注意,因为类变量为所有实例化对象共有,通过类名修改类变量的值,会影响所有的实例化对象。

实例变量(实例属性)

  • 实例变量指的是在任意类方法内部,以==“self.变量名”的方式定义的变量==,其特点是只作用于调用方法的对象。另外,实例变量只能通过对象名访问,无法通过类名访问。
class Turtle:  
    name="Mike"  
    color="black"  
    legs=4  
    def __init__(self):  
        self.name="Mike"  
        self.color="black"  
        self.legs=4  
    def say(self):  
        self.catalog = 13

此 CLanguage 类中,name、color 、legs及catalog 都是实例变量。其中,由于 init() 函数在创建类对象时会自动调用,而 say() 方法需要类对象手动调用。因此,Turtle 类的类对象都会包含 name、color 和legs实例变量,而只有调用了 say() 方法的类对象,才包含 catalog 实例变量。

  • 通过类对象可以访问类变量,但无法修改类变量的值。这是因为,通过类对象修改类变量的值,不是在给“类变量赋值”,而是定义新的实例变量
  • 类中,实例变量和类变量可以同名,但这种情况下使用类对象将无法调用类变量,它会首选实例变量,这也是不推荐“类变量使用对象名调用”的原因。

局部变量

  • 除了实例变量,类方法中还可以定义局部变量。和前者不同,局部变量直接以“变量名=值”的方式进行定义。通常情况下,定义局部变量是为了所在类方法功能的实现。需要注意的一点是,局部变量只能用于所在函数中,函数执行完成后,局部变量也会被销毁。

Python实例方法、静态方法和类方法详解(包含区别和用法)

  • 和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法、实例方法和静态方法。

Python类实例方法

  • 通常情况下,在类中定义的方法默认都是实例方法。
class Turtle:
    #类构造方法,也属于实例方法
    def __init__(self):
        self.name = "Mike"
        self.color = "red"
    # 下面定义了一个say实例方法
    def say(self):
        print("正在调用 say() 实例方法")

实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。

Python类方法

  • Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。和 self 一样,cls 参数的命名也不是规定的(可以随意命名),只是 Python 程序员约定俗称的习惯而已。和实例方法最大的不同在于,类方法需要使用@classmethod修饰符进行修饰,例如:
class Turtle:
    #类构造方法,也属于实例方法
    def __init__(self):
        self.name = "Mike"
        self.color = "red"
    #下面定义了一个类方法
    @classmethod
    def info(cls):
        print("正在调用类方法",cls)

注意,如果没有 @classmethod,则 Python 解释器会将 fly() 方法认定为实例方法,而不是类方法。

Python类静态方法

  • 静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。静态方法需要使用@staticmethod修饰,例如:
class Turtle:
    @staticmethod
    def info(name,color):
        print(name,color)

  1. 类中的所有变量称为属性 ↩︎

  2. 类中的所有函数通常称为方法 ↩︎

  3. 客观的事物封装成类(将数据和方法放在一个类中就构成了封装) ↩︎

  4. 在python中一个类可以集成于另一个类也可以继承多个类,被继承的类叫父类(或者叫基类,base class),继承的类叫子类 ↩︎

  5. 指的是一类事物有多种形态,一个抽象类有多个子类(因而多态的概念依赖于继承),不同的子类对象调用相同的方法,产生不同的执行结果,多态可以增加代码的灵活度 ↩︎

相关推荐

  1. python对象

    2023-12-22 08:04:02       73 阅读
  2. Python对象

    2023-12-22 08:04:02       40 阅读
  3. python实践笔记(二): 对象

    2023-12-22 08:04:02       27 阅读
  4. Python面向对象编程:入门篇(对象

    2023-12-22 08:04:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-22 08:04:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-22 08:04:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-22 08:04:02       82 阅读
  4. Python语言-面向对象

    2023-12-22 08:04:02       91 阅读

热门阅读

  1. Servlet技术j详解1

    2023-12-22 08:04:02       48 阅读
  2. Hive动态分区和分桶

    2023-12-22 08:04:02       60 阅读
  3. Hive-基础介绍

    2023-12-22 08:04:02       58 阅读
  4. Hive-分区与分桶详解(超详细)

    2023-12-22 08:04:02       51 阅读
  5. redis 实现队列

    2023-12-22 08:04:02       65 阅读
  6. 算法练习Day18 (Leetcode/Python-二叉树)

    2023-12-22 08:04:02       63 阅读
  7. python3+selenium 切换窗口方法

    2023-12-22 08:04:02       63 阅读
  8. 流媒体知识总结

    2023-12-22 08:04:02       62 阅读
  9. 在 Go 语言中使用 regexp 包处理正则表达式

    2023-12-22 08:04:02       48 阅读
  10. Ansible3

    Ansible3

    2023-12-22 08:04:02      59 阅读
  11. css学习笔记5

    2023-12-22 08:04:02       62 阅读
  12. Android 9.0 应用权限屏蔽位置信息

    2023-12-22 08:04:02       43 阅读