在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中,有许多内置的方法名有特殊的意义,这些方法名通常以双下划线(__
)开始和结束。它们也被称为魔法方法或特殊方法。这些方法可以让我们重载或者定义对象的操作。
在Python中,__init__方法是一个特殊的方法(有时称为‘魔法方法’),在创建类实例对象时被自动调用。
初始化实例的属性(起到一个传递参数的作用)
class Myclass(object):
def __init__(self,value):
self.my_attribute = value
def my_method(self):
return self.my_attribute
# 创建一个类的实例
my_instance = MyClass(10)
# 调用实例的方法
print(my_instance.my_method()) # 输出: 10
??????? 1、__init__方法不是一个构造函数,它在类实例化对象后运行,用来初始化实例对象属性;
??????? 2、第一个参数self是实例对象的引用,确保在方法内部访问实例对象的属性和其他方法
self
不是Python的关键字或强制性的,它只是一个按照惯例使用的变量名。你可以使用其他变量名,但强烈建议遵循这个约定,因为它对于其他Python程序员来说是最易读和理解的。
??????? 3、__init__方法可以有任意数量的参数,这些参数在创建类实例对象时传入。
??????? 4、__init__方法可以是空的,也可以不写但通常被用来设置实例的初始化状态(传参)。
??????? 5、如果你有一个继承链,__init__
?方法需要调用基类的?__init__
?方法,以确保基类也被正确初始化。这可以通过使用?super()
?函数实现。
在Python中,__str__()
方法是一个特殊的方法,用于定义一个对象的“正式”字符串表示,当你使用print()
函数或str()
函数将对象转换为字符串时,Python解释器会调用这个方法。它通常应该返回一个友好易读的字符串,让用户能够理解对象的状态。
作用:
格式化字符串
class Cat(object):
def __init__(self,name, age, height):
self.username = name
self.age = age
self.height = height
def __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()方法执行时,得到该对象转换后的字符串类型。???
在Python中,__del__
方法是一个特殊方法,它被称为析构器(destructor)。这个方法在对象即将被删除时被自动调用。通常情况下,这发生在Python的垃圾回收器决定从内存中删除一个对象时,或者当对象的引用计数降到0时。
__del__
方法的主要用途是确保对象释放分配给它的资源。例如,如果对象持有文件、网络连接或数据库连接等资源,__del__
方法可以确保这些资源在对象不再使用时被正确关闭。
class Cat(object):
def __init__(self,name):
self.name = name
def __del__(self):
# 要在这个方法中将当前对象持有的其它对象手动销毁
del self.name
print('del run ...')
tom = Cat('tom')
# 执行下面的代码 时,会自动 调用 __del__ 方法,将这个对象销毁,回收对象内存资源
del tom
print('over')
Python中的类是创建自定义数据结构的强大工具,它支持继承、多态性和封装等OOP特性。通过理解类如何工作,你可以写出更加模块化、可重用和易于维护的代码。记住,类应该简单而且一目了然,最好每个类只负责一件事情。掌握了Python中的类,将有助于你在面向对象编程的世界中进行更深入的探索。