31 通过类创建对象、添加方法(Python的实例方法、特殊方法(魔法方法))、类变量和实例变量

 欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力

对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

    专栏:

文章概述:对类创建对象、添加方法(Python的实例方法、特殊方法(魔法方法))、类变量和实例变量的介绍

关键词:类创建对象 添加方法(Python的实例方法、特殊方法(魔法方法)) 类变量和实例变量

本文目录

Python类和对象

添加一些属性

可以给类添加一些 特殊方法(魔术方法)

1. __init__ 方法

情况分析:

2. __del__ 方法

3. __str__ 方法

实例化对象的步骤

Python的魔法方法

1. __add__

2. __repr__

分析:上例中Vector 类定义如下:

使用 repr()

在交互式解释器 (例如,Python REPL 或 Jupyter Notebook) 中的表现

__repr__ 与 __str__ 的区别

3. __len__

4. __call__

总结

特殊方法(魔法方法)

  

Python类和对象

在 Python 中,构造方法是 __init__ 方法。

__init__ 方法

  1. 定义和用途
    • 定义__init__ 是一个特殊的方法,定义在类中,用于初始化类的实例。当创建一个新的对象时,__init__ 方法会被自动调用。
    • 用途:通常用于设置对象的初始状态,即为对象的属性赋初值,或者执行其他必要的初始化操作。

class Person:
  def __init__(self):
    print("Hello World")
    
x = Person()

添加一些属性

class Person:
  def __init__(self):
    self.name = "yasaka"
    self.age = 25
    
person1 = Person()
print(person1.name)
print(person1.age)

通过类创建对象时传入属性

class Person:
  def __init__(self, name, age, height):
    self.name = name
    self.age = age
    self.height = height
    
person1 = Person("yasaka", 30, 180)
print(person1.name)
print(person1.age)


person2 = Person("bob", 35, 175)
print(person2.name)
print(person2.age)


person1.name = "henry"
print(person1.name)

可以给类添加一些 特殊方法(魔术方法)

1. __init__ 方法

  • 定义__init__(self, name, age, height) 是构造方法,用于初始化对象的属性。
  • 作用:当创建一个新的对象时,__init__ 方法被自动调用。它用来设置对象的初始状态或属性。

在 Python 中,不是每个类都需要显式地定义 __init__ 方法。__init__ 方法是一种特殊的方法,用于初始化新创建的对象的状态。如果不定义 __init__ 方法,Python 会提供一个默认的构造函数。

在 Python 中,是否需要定义 __init__ 方法取决于希望对象在创建时是否需要特定的初始化操作。如果对象的属性可以在创建后动态添加,或者不需要特定的初始化过程,可以使用默认的构造函数。然而,如果需要在创建时设置对象的初始状态,那么定义 __init__ 方法是非常常见和有用的做法。

情况分析:

  1. 如果不定义 __init__ 方法
    • 如果没有显式地定义 __init__ 方法,Python 会提供一个默认的构造函数。这个默认的构造函数不做任何事情,仅是一个占位符。
    • 例如:
class MyClass:
    pass

这样的类定义完全合法,MyClass 类会有一个默认的构造函数。

  1. 定义 __init__ 方法的作用
    • 当希望在创建对象时进行一些初始化工作,比如设置属性的初始值,或执行一些必要的设置操作时,就需要定义 __init__ 方法。
    • __init__ 方法允许传递参数来初始化对象的状态,以及执行其他的初始化操作。
  1. 使用默认构造函数的情况
    • 如果类的对象不需要特定的初始化过程,或者仅需要默认的属性和方法,可以直接使用默认的构造函数。
    • 例如:
class Point:
    def move(self, x, y):
        self.x = x
        self.y = y

p = Point()
p.move(3, 4)
print(p.x, p.y)  # 输出: 3 4

这里的 Point 类没有显式定义 __init__ 方法,但依然可以创建对象,并使用 move 方法为对象设置属性。

2. __del__ 方法

  • 定义__del__(self) 是析构方法,用于清理对象时调用。它在对象被垃圾回收时自动调用。
  • 作用:通常用于释放对象占用的资源,如关闭文件、断开数据库连接等。注意,__del__ 方法的调用时机不可预测,因此应谨慎使用。

3. __str__ 方法

  • 定义__str__(self) 返回一个表示对象的字符串。当使用 print 函数或 str() 函数打印对象时,__str__ 方法会被调用。
  • 作用:提供对象的可读字符串表示,使得对象在打印时更具可读性。
class Person:
  def __init__(self, name, age, height):
    self.name = name
    self.age = age
    self.height = height
    
  def sayHello(self):
    print("Hello world")
    
  def __del__(self):
    print("Object deleted")
    
  def __str__(self):
    return "Name: {}, Age: {}, Height: {}".format(self.name, self.age, self.height)

person1 = Person("yasaka", 30, 180)
print(person1.name)
print(person1.age)

print(person1)

类变量

在 Python 中,类变量 是属于类的变量,而不是属于类的实例。类变量在所有类实例之间共享,因此改变类变量的值会影响所有实例。这与实例变量(每个实例都有独立的变量)不同

在 Java 中,类变量(也称为静态变量)与实例变量的区别较为明显。类变量属于类而不是类的实例,因此它在所有实例之间共享。

amount(类变量)

  • 定义amount 是一个类变量,因为它在类体内定义,但在任何方法之外。
  • 作用amount 是属于 Person 类本身的变量,而不是某个特定实例。它在所有实例之间共享。amount 用于跟踪当前创建了多少个 Person 对象。
  • 访问:可以通过类名 Person.amount 或通过任何实例 person1.amount 来访问和修改。
  • 修改:每次创建一个新的 Person 对象,amount 会增加 1;每次删除一个 Person 对象,amount 会减少 1。

self.nameself.ageself.height(实例变量)

  • 定义self.nameself.ageself.height 是实例变量,它们在 __init__ 构造方法中定义并赋值。
  • 作用:这些变量属于对象的每个实例,每个实例有自己的副本。它们用于存储每个 Person 对象的具体属性值。
  • 访问:只能通过实例访问这些变量,比如 person1.nameperson1.ageperson1.height
  • 修改:每个实例可以有不同的 nameageheight 值,修改这些值只会影响当前实例。

实例化对象的步骤

  1. 调用类
    • Person("yasaka", 30, 180) 是对 Person 类的调用,这实际上是创建了 Person 类的一个实例。
    • Python 会自动调用 Person 类的构造方法 __init__,并传递 "yasaka", 30, 180 作为参数。
  1. 构造方法 __init__
    • Person 类被调用时,Python 会执行 __init__ 方法,初始化新创建的对象的属性。
    • __init__ 方法中,self.name 被设置为 "yasaka"self.age 被设置为 30self.height 被设置为 180
    • Person.amount += 1 语句将类变量 amount 的值增加 1,因为新创建了一个 Person 对象。
  1. 对象创建完成
    • person1Person 类的一个实例。通过 person1 可以访问 Person 类中定义的方法和属性。
    • person1 实际上是一个 Person 类的对象,它拥有 nameageheight 属性,以及 sayHelloget_older 方法。
class Person:
  amount = 0
  
  def __init__(self, name, age, height):
    self.name = name
    self.age = age
    self.height = height
    Person.amount += 1
    
  def __del__(self):
    Person.amount -= 1
    
  def __str__(self):
    return "Name: {}, Age: {}, Height: {}".format(self.name, self.age, self.height)
  
  def get_older(years):
    self.age += years

#实例化对象
person1 = Person("yasaka", 30, 180)
print(person1)
person2 = Person("Sara", 40, 170)
print(Person.amount)
del person2
print(Person.amount)

Person 类中,get_older 是一个实例方法,用于增加 age 属性的值。

定义实例方法

实例方法是定义在类中的普通方法,第一个参数通常是 self,它代表实例本身。实例方法可以访问和修改实例的属性,也可以调用其他实例方法。 要使用这个方法,需要在类的实例上调用它。

注意 :如果参数有self,self 必须作为第一个参数传递给实例方法,Python 会自动将调用方法的实例作为 self 参数传递给方法。

使用 get_older 方法

  1. 创建实例:首先,需要创建 Person 类的一个实例。例如:
person1 = Person("yasaka", 30, 180)
  1. 调用方法:然后,可以在实例上调用 get_older 方法。例如:
person1.get_older(5)

这个调用会将 person1age 属性增加 5 年。

Python的魔法方法

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age


  def __del__(self):
    print("Object is being deleted")
  
p = Person("Mike", 25)

class Vector:
  def __init__(self, x, y):
    self.x = x
    self.y = y
  
  def __add__(self, other):
    return Vector(self.x+other.x, self.y+other.y)
  
  def __repr__(self):
    return f"X: {self.x}, Y: {self.y}"
  
  def __len__(self):
    return 10
  
  def __call__(self):
    print("Hello, I was called")
    
v1 = Vector(10, 20)
v2 = Vector(30, 40)
v3 = v1+v2

print(v3)
print(len(v3))

v3()

1. __add__

定义

def __add__(self, other):
    return Vector(self.x + other.x, self.y + other.y)

作用

  • 定义了加法操作符 + 的行为。当使用 v1 + v2 这种形式时,Python 会调用 __add__ 方法。
  • 这个方法接受另一个 Vector 对象 other 作为参数,返回一个新的 Vector 对象, 其 xy 分别是两个向量的 xy 分量的和。

使用

v3 = v1 + v2  # 调用 __add__ 方法,结果是 Vector(40, 60)

2. __repr__

定义

def __repr__(self):
    return f"X: {self.x}, Y: {self.y}"

作用

  • 定义了 repr() 函数和交互式解释器 (例如,Python REPL 或 Jupyter Notebook) 中对象的显示方式。__repr__ 方法应该返回一个字符串,这个字符串是一个有效的 Python 表达式,用于重建该对象的状态。
  • print(v3) 时,__repr__ 方法会被调用,返回的字符串会被输出。

使用

print(v3)  # 输出: X: 40, Y: 60

分析:上例中Vector 类定义如下:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __repr__(self):
        return f"Vector(x={self.x}, y={self.y})"
使用 repr()
v = Vector(10, 20)
print(repr(v))  # 输出: Vector(x=10, y=20)
在交互式解释器 (例如,Python REPL 或 Jupyter Notebook) 中的表现

我用jupyter notebook 演示的,有不会用jupyter notebook 的推荐去看一下我的博客,python 语法基础里面有专门的讲解,个人觉得非常好用

__repr____str__ 的区别

  • __repr__:主要用于开发和调试,返回一个字符串,尽可能精确地描述对象的状态。目标是提供足够的信息以便于重建对象,尽管这不总是可能的。
  • __str__:主要用于用户展示,返回一个易于理解和阅读的字符串。目标是提供对象的“美观”表示,通常用于打印和用户界面展示。

如果两个方法都定义了,__str__ 通常用于 print() 函数,而 __repr__ 用于交互式解释器和 repr() 函数。如果只定义了 __repr__print() 和交互式解释器都会使用它。

__repr__ 允许定义对象在调试和开发时的字符串表示,这个表示通常应该尽可能准确地描述对象的状态,并且如果可能的话,能够用来重建对象。__repr__ 的目标是提供一种对开发者有用的详细表示。

3. __len__

定义

def __len__(self):
    return 10

作用

  • 定义了内置函数 len() 的行为。当使用 len(v3) 时,Python 会调用 __len__ 方法。
  • 返回一个整数,这里是 10。通常,这个方法应该返回对象的长度或大小,但在这里它只是返回了一个固定值。

使用

print(len(v3))  # 输出: 10

4. __call__

定义

def __call__(self):
    print("Hello, I was called")

作用

  • 使得对象可以像函数一样被调用。当调用 v3() 时,Python 会调用 __call__ 方法。
  • 在这个方法中,打印了一个消息 "Hello, I was called"

使用

v3()  # 调用 __call__ 方法,输出: Hello, I was called

总结

特殊方法(魔法方法)

  • 定义:特殊方法(通常以双下划线开始和结束)用于实现 Python 的特殊行为,如运算符重载、对象表示和调用等
  • __init__:构造方法,用于初始化对象。
  • __str__:用于返回一个易于阅读的字符串表示。
  • __repr__:用于返回一个适合调试和开发的字符串表示。
  • __add__:定义加法操作符的行为。
  • __len__:定义 len() 函数的行为。
  • __call__:使对象可以像函数一样被调用。
  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值