Python中的类和对象(中级)
admin
2023-07-31 01:43:14
0

Python中一切都是对象。类提供了创建新类型对象的机制。这篇教程中,我们不谈类和面向对象的基本知识,而专注在更好地理解Python面向对象编程上。假设我们使用新风格的python类,它们继承自object父类。

定义类

class 语句可以定义一系列的属性、变量、方法,他们被该类的实例对象所共享。下面给出一个简单类定义:

12345678910111213141516171819 class Account(object):        num_accounts = 0         def __init__(self, name, balance):            self.name = name             self.balance = balance             Account.num_accounts += 1         def del_account(self):            Account.num_accounts -= 1         def deposit(self, amt):            self.balance = self.balance + amt          def withdraw(self, amt):            self.balance = self.balance amt          def inquiry(self):            return self.balance

类定义引入了以下新对象:

  1. 类对象
  2. 实例对象
  3. 方法对象

类对象

程序执行过程中遇到类定义时,就会创建新的命名空间,命名空间包含所有类变量和方法定义的名称绑定。注意该命名空间并没有创建类方法可以使用的新局部作用域,因此在方法中访问变量需要全限定名称。上一节的Account类演示了该特性;尝试访问num_of_accounts变量的方法需要使用全限定名称Account.num_of_accounts,否则,如果没有在__init__方法中使用全限定名称,会引发如下错误:

12345678910111213141516171819202122232425 class Account(object):    num_accounts = 0     def __init__(self, name, balance):        self.name = name         self.balance = balance         num_accounts += 1     def del_account(self):        Account.num_accounts -= 1     def deposit(self, amt):        self.balance = self.balance + amt      def withdraw(self, amt):        self.balance = self.balance amt      def inquiry(self):        return self.balance  >>> acct = Account(\’obi\’, 10)Traceback (most recent call last):  File \”python\”, line 1, in <module>  File \”python\”, line 9, in __init__UnboundLocalError: local variable \’num_accounts\’ referenced before assignment

类定义执行的最后,会创建一个类对象。在进入类定义之前有效的那个作用域现在被恢复了,同时类对象被绑定到类定义头的类名上。

先偏离下话题,你可能会问如果创建的类是对象,那么类对象的类是什么呢?。与一切都是对象的python哲学一致,类对象确实有个类,即python新风格类中的type类。

12 >>> type(Account)<class \’type\’>

让你更迷惑一点,Account类型的类型是type。type类是个元类,用于创建其他类,我们稍后教程中再介绍。

类对象支持属性引用和实例化。属性通过标准的点语法引用,即对象后跟句点,然后是属性名:obj.name。有效的属性名是类对象创建后类命名空间中出现的所有变量和方法名。例如:

1234 >>> Account.num_accounts>>> 0>>> Account.deposit>>> <unbound method Account.deposit>

类实例化使用函数表示法。实例化会像普通函数一样无参数调用类对象,如下文中的Account类:


unt.deposit>

类实例化使用函数表示法。实例化会像普通函数一样无参数调用类对象,如下文中的Account类:


Python中一切都是对象。类提供了创建新类型对象的机制。这篇教程中,我们不谈类和面向对象的基本知识,而专注在更好地理解Python面向对象编程上。假设我们使用新风格的python类,它们继承自object父类。

定义类

class 语句可以定义一系列的属性、变量、方法,他们被该类的实例对象所共享。下面给出一个简单类定义:

12345678910111213141516171819 class Account(object):        num_accounts = 0         def __init__(self, name, balance):            self.name = name             self.balance = balance             Account.num_accounts += 1         def del_account(self):            Account.num_accounts -= 1         def deposit(self, amt):            self.balance = self.balance + amt          def withdraw(self, amt):            self.balance = self.balance amt          def inquiry(self):            return self.balance

类定义引入了以下新对象:

  1. 类对象
  2. 实例对象
  3. 方法对象

类对象

程序执行过程中遇到类定义时,就会创建新的命名空间,命名空间包含所有类变量和方法定义的名称绑定。注意该命名空间并没有创建类方法可以使用的新局部作用域,因此在方法中访问变量需要全限定名称。上一节的Account类演示了该特性;尝试访问num_of_accounts变量的方法需要使用全限定名称Account.num_of_accounts,否则,如果没有在__init__方法中使用全限定名称,会引发如下错误:

12345678910111213141516171819202122232425 class Account(object):    num_accounts = 0     def __init__(self, name, balance):        self.name = name         self.balance = balance         num_accounts += 1     def del_account(self):        Account.num_accounts -= 1     def deposit(self, amt):        self.balance = self.balance + amt      def withdraw(self, amt):        self.balance = self.balance amt      def inquiry(self):        return self.balance  &gt;&gt;&gt; acct = Account(\’obi\’, 10)Traceback (most recent call last):  File \”python\”, line 1, in &lt;module&gt;  File \”python\”, line 9, in __init__UnboundLocalError: local variable \’num_accounts\’ referenced before assignment

类定义执行的最后,会创建一个类对象。在进入类定义之前有效的那个作用域现在被恢复了,同时类对象被绑定到类定义头的类名上。

先偏离下话题,你可能会问如果创建的类是对象,那么类对象的类是什么呢?。与一切都是对象的python哲学一致,类对象确实有个类,即python新风格类中的type类。

12 >>> type(Account)<class \’type\’>

让你更迷惑一点,Account类型的类型是type。type类是个元类,用于创建其他类,我们稍后教程中再介绍。

类对象支持属性引用和实例化。属性通过标准的点语法引用,即对象后跟句点,然后是属性名:obj.name。有效的属性名是类对象创建后类命名空间中出现的所有变量和方法名。例如:

1234 >>> Account.num_accounts>>> 0>>> Account.deposit>>> <unbound method Account.deposit>

类实例化使用函数表示法。实例化会像普通函数一样无参数调用类对象,如下文中的Account类:


610\” class=\”crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate\” data-settings=\” touchscreen minimize scroll-mouseover\” style=\” margin-top: 12px; margin-bottom: 12px; font-size: 13px !important; line-height: 15px !important;\”>

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...