Pyhton之深入理解类

发布时间:2023年12月19日

深入理解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 = value
    def 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 = 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()方法执行时,得到该对象转换后的字符串类型。???

__del__()方法

在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中的类,将有助于你在面向对象编程的世界中进行更深入的探索。

文章来源:https://blog.csdn.net/qq_44709053/article/details/135051459
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。