深入理解Python中的类
简介
在Python中,类是实现面向对象编程(OOP)的主要工具。它们允许我们创建自定义的数据结构,它包含了数据和对数据操作的方法。本文将帮助你理解Python中类的工作原理,以及如何有效地使用它们。
类的基本概念
定义一个新式类
在Python中定义一个类使用关键字class
:
class Person(object):# 定义两个方法def eat(self,food):print('吃', food)def sleep(self,t):print('每天至少睡',t,'小时')
创建实例
要使用类,我们需要创建它的实例:
实例对象后,会在内存中分配一块空间,这个空间就是实例对象的位置
tom = Person()
实例多个对象
实例多个对象会在内存中分配不同的空间,然后将地址引用给对象名。
a = Person()
b = Person()
c = Person()print(a)
print(b)
print(c)'''
输出
<__main__.MyClass object at 0x000002D374234E80>
<__main__.MyClass object at 0x000002D3745783D0>
<__main__.MyClass object at 0x000002D37433A5E0>
'''
当我们创建一个类的实例时,__init__
方法会被自动调用,接受我们传递的参数(在这个例子中是"我是一个实例属性")。
访问属性和方法
创建实例后,我们可以访问其属性和方法:
tom.eat('饭')
tom.eat('海鲜')
tom.sleep(8)
'''
输出
吃 饭
吃 海鲜
每天至少睡 8 小时
'''
私有属性和方法
私有属性
私有方法
继承
Python支持类的继承,允许我们创建新的类作为现有类的子类,继承其属性和方法,并可以添加新的属性和方法或覆盖现有的。
class SubClass(MyClass): """继承自MyClass的子类""" def method(self): """覆盖了MyClass中的方法""" return "调用了子类的方法"
现在SubClass
会继承MyClass
的所有特性,但method
方法已经被覆盖了。
多态性
多态性是OOP的一个核心概念,它允许我们编写可以与多种类型的对象一起工作的函数或方法,只要这些对象都有一个公共的接口(比如相同名称的方法)
def call_method(obj): return obj.method()
# 即使是不同类型的对象,但是只要它们都有`method`方法,都可以使用 print(call_method(instance)) # 调用MyClass的实例 print(call_method(SubClass(42))) # 调用SubClass的实例
类和实例属性
类属性与实例属性之间有重要的区别。类属性是属于类的,被所有实例共享。而实例属性仅属于特定的实例。
class DemoClass: class_attr = 0 def __init__(self, value): self.instance_attr = value # 创建两个实例 a = DemoClass(1) b = DemoClass(2) # 修改类属性,会影响所有实例 DemoClass.class_attr = 5 print(a.class_attr) # 输出: 5 print(b.class_attr) # 输出: 5 # 修改实例属性,只影响那个特定的实例 a.instance_attr = 10 print(a.instance_attr) # 输出: 10 print(b.instance_attr) # 输出: 2
魔法方法
在Python中,有许多内置的方法名有特殊的意义,这些方法名通常以双下划线(__
)开始和结束。它们也被称为魔法方法或特殊方法。这些方法可以让我们重载或者定义对象的操作。
__init__() 方法:
在Python中,__init__方法是一个特殊的方法(有时称为‘魔法方法’),在创建类实例对象时被自动调用。
作用:
初始化实例的属性(起到一个传递参数的作用)
class Myclass(object):def __init__(self,value):self.my_attribute = valuedef my_method(self):return self.my_attribute# 创建一个类的实例
my_instance = MyClass(10)
# 调用实例的方法
print(my_instance.my_method()) # 输出: 10
__init__方法特点:
1、__init__方法不是一个构造函数,它在类实例化对象后运行,用来初始化实例对象属性;
2、第一个参数self是实例对象的引用,确保在方法内部访问实例对象的属性和其他方法
self
不是Python的关键字或强制性的,它只是一个按照惯例使用的变量名。你可以使用其他变量名,但强烈建议遵循这个约定,因为它对于其他Python程序员来说是最易读和理解的。
3、__init__方法可以有任意数量的参数,这些参数在创建类实例对象时传入。
4、__init__方法可以是空的,也可以不写但通常被用来设置实例的初始化状态(传参)。
5、如果你有一个继承链,__init__
方法需要调用基类的 __init__
方法,以确保基类也被正确初始化。这可以通过使用 super()
函数实现。
__str__()方法
在Python中,__str__()
方法是一个特殊的方法,用于定义一个对象的“正式”字符串表示,当你使用print()
函数或str()
函数将对象转换为字符串时,Python解释器会调用这个方法。它通常应该返回一个友好易读的字符串,让用户能够理解对象的状态。
作用:
格式化字符串
class Cat(object):def __init__(self,name, age, height):self.username = nameself.age = ageself.height = heightdef __str__(self):print('String Run ..',self.username)# print(self.username, self.age, self.height)s = f'姓名:{self.username}年龄:{self.age}身高:{self.height}'return s
tom = Cat('Tom',1,'50cm')
print(tom)
'''
输出
姓名:Tom年龄:1身高:50cm
'''
_str__()
方法特点:
1、_str__()
方法必须有一个返回值而且返回值必须是字符串。
2、如果需要将实例对象的信息按照一定的格式进行显示,可以在这里进行修饰。
3、修饰完,可以将这个格式化字符串返回,让str()方法执行时,得到该对象转换后的字符串类型。
__del__()方法
在Python中,__del__
方法是一个特殊方法,它被称为析构器(destructor)。这个方法在对象即将被删除时被自动调用。通常情况下,这发生在Python的垃圾回收器决定从内存中删除一个对象时,或者当对象的引用计数降到0时。
__del__
方法的主要用途是确保对象释放分配给它的资源。例如,如果对象持有文件、网络连接或数据库连接等资源,__del__
方法可以确保这些资源在对象不再使用时被正确关闭。
class Cat(object):def __init__(self,name):self.name = namedef __del__(self):# 要在这个方法中将当前对象持有的其它对象手动销毁del self.nameprint('del run ...')
tom = Cat('tom')
# 执行下面的代码 时,会自动 调用 __del__ 方法,将这个对象销毁,回收对象内存资源
del tom
print('over')
结论
Python中的类是创建自定义数据结构的强大工具,它支持继承、多态性和封装等OOP特性。通过理解类如何工作,你可以写出更加模块化、可重用和易于维护的代码。记住,类应该简单而且一目了然,最好每个类只负责一件事情。掌握了Python中的类,将有助于你在面向对象编程的世界中进行更深入的探索。