热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python面向对象编程入门(十二):深入理解类与实例

本文详细介绍了Python中的新式类与经典类的区别,包括类的定义、实例化过程、方法调用机制、类属性的使用及查看方式等内容,并通过具体示例展示了如何创建和使用类。

在Python中,类是实现面向对象编程的基础。本文将详细介绍新式类与经典类的概念及其主要区别,同时探讨类的定义、实例化、方法调用等核心概念。

1. 新式类与经典类

Python 2.x版本中,存在新式类与经典类两种类型。新式类是从Python 2.2版本开始引入的,其主要目的是为了统一类的行为,解决多重继承时的MRO(Method Resolution Order)问题。

  • 新式类: 定义时必须显式或隐式地继承自object类,即所有类最终都继承自object
  • 经典类: 不显式继承任何类,或仅继承自非新式类。
# 新式类示例
class NewStyleClass(object):
pass

# 经典类示例
# Python 2.x 版本中
# 注意:Python 3.x 中所有类默认都是新式类

class ClassicClass:
pass

在Python 3.x中,所有类默认都是新式类,因此无需显式继承object

2. 类的定义与实例化

类的定义使用class关键字,可以包含属性和方法。类的实例化是指根据类创建对象的过程。

class MyClass:
def __init__(self, name, phone):
self.name = name
self.phOne= phone
print(f'Your name is {self.name}')

def update_phone(self, new_phone):
self.phOne= new_phone
print(f'New phone: {self.phone}')

# 实例化
john = MyClass('John', '1234567890')
jane = MyClass('Jane', '0987654321')

print(john.name) # 输出: John
john.update_phone('9876543210') # 输出: New phone: 9876543210

在上述示例中,__init__方法是一个特殊的方法,称为构造函数,用于初始化新创建的对象。

3. 方法调用

在Python中,方法是绑定到类实例的函数。调用方法时,实例对象会自动传递给方法的第一个参数,通常命名为self

class Example:
def print_foo(self):
print(1)

example = Example()
example.print_foo() # 输出: 1

注意,self参数在方法定义时必须显式指定,但在调用时由解释器自动传递。

4. 类属性与实例属性

类属性是类的所有实例共享的属性,而实例属性是每个实例独有的。

class MyClass:
class_attribute = 100 # 类属性

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

# 访问类属性
print(MyClass.class_attribute) # 输出: 100

# 修改类属性
MyClass.class_attribute += 1
print(MyClass.class_attribute) # 输出: 101

# 创建实例并访问实例属性
instance = MyClass('Instance Value')
print(instance.instance_attribute) # 输出: Instance Value

可以通过dir()函数和__dict__属性查看类的属性。

class MyClass:
my_version = '1'

def show_my_version(self):
print(MyClass.my_version)

print(dir(MyClass)) # 输出类的所有属性和方法
print(MyClass.__dict__) # 输出类的字典属性

5. 静态方法与类方法

静态方法和类方法是Python中特殊的类方法,分别通过@staticmethod@classmethod装饰器定义。

class MyClass:
@staticmethod
def static_method():
print('Static method called')

@classmethod
def class_method(cls):
print('Class method called')

MyClass.static_method() # 输出: Static method called
MyClass.class_method() # 输出: Class method called

静态方法不需要传递实例或类作为参数,而类方法需要传递类作为第一个参数,通常命名为cls

6. 子类与继承

子类可以继承父类的属性和方法,并且可以重写或扩展这些方法。

class Parent:
def foo(self):
print('Parent method')

class Child(Parent):
def foo(self):
print('Child method')

parent = Parent()
child = Child()

parent.foo() # 输出: Parent method
child.foo() # 输出: Child method

如果不想完全覆盖父类的方法,可以使用super()函数调用父类的方法。

class Child(Parent):
def foo(self):
super().foo() # 调用父类方法
print('Child method')

child = Child()
child.foo() # 输出: Parent method
# Child method

7. 内建函数与特殊方法

Python提供了一些内建函数和特殊方法,用于检查类和实例的关系,以及定制类的行为。

  • issubclass(sub, sup): 检查sub是否是sup的子类。
  • isinstance(obj, cls): 检查obj是否是cls的实例。
class A:
pass

class B(A):
pass

print(issubclass(B, A)) # 输出: True
print(isinstance(B(), A)) # 输出: True

特殊方法如__init____str__等,用于定制类的行为。

class MyClass:
def __init__(self, value):
self.value = value

def __str__(self):
return f'MyClass instance with value: {self.value}'

instance = MyClass(10)
print(instance) # 输出: MyClass instance with value: 10

通过以上内容,希望读者能够更好地理解和掌握Python中的面向对象编程。


推荐阅读
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
author-avatar
记录生活点滴1988_234
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有