热门标签 | 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中的面向对象编程。


推荐阅读
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社区 版权所有