欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力
对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。
专栏:
文章概述:对类创建对象、添加方法(Python的实例方法、特殊方法(魔法方法))、类变量和实例变量的介绍
关键词:类创建对象 添加方法(Python的实例方法、特殊方法(魔法方法)) 类变量和实例变量
本文目录:
Python类和对象
在 Python 中,构造方法是 __init__
方法。
__init__
方法
- 定义和用途:
-
- 定义:
__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__
方法是非常常见和有用的做法。
情况分析:
- 如果不定义
__init__
方法:
-
- 如果没有显式地定义
__init__
方法,Python 会提供一个默认的构造函数。这个默认的构造函数不做任何事情,仅是一个占位符。 - 例如:
- 如果没有显式地定义
class MyClass:
pass
这样的类定义完全合法,MyClass
类会有一个默认的构造函数。
- 定义
__init__
方法的作用:
-
- 当希望在创建对象时进行一些初始化工作,比如设置属性的初始值,或执行一些必要的设置操作时,就需要定义
__init__
方法。 __init__
方法允许传递参数来初始化对象的状态,以及执行其他的初始化操作。
- 当希望在创建对象时进行一些初始化工作,比如设置属性的初始值,或执行一些必要的设置操作时,就需要定义
- 使用默认构造函数的情况:
-
- 如果类的对象不需要特定的初始化过程,或者仅需要默认的属性和方法,可以直接使用默认的构造函数。
- 例如:
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.name
、self.age
和 self.height
(实例变量):
- 定义:
self.name
、self.age
和self.height
是实例变量,它们在__init__
构造方法中定义并赋值。 - 作用:这些变量属于对象的每个实例,每个实例有自己的副本。它们用于存储每个
Person
对象的具体属性值。 - 访问:只能通过实例访问这些变量,比如
person1.name
、person1.age
和person1.height
。 - 修改:每个实例可以有不同的
name
、age
和height
值,修改这些值只会影响当前实例。
实例化对象的步骤
- 调用类:
-
Person("yasaka", 30, 180)
是对Person
类的调用,这实际上是创建了Person
类的一个实例。- Python 会自动调用
Person
类的构造方法__init__
,并传递"yasaka"
,30
,180
作为参数。
- 构造方法
__init__
:
-
- 当
Person
类被调用时,Python 会执行__init__
方法,初始化新创建的对象的属性。 - 在
__init__
方法中,self.name
被设置为"yasaka"
,self.age
被设置为30
,self.height
被设置为180
。 Person.amount += 1
语句将类变量amount
的值增加 1,因为新创建了一个Person
对象。
- 当
- 对象创建完成:
-
person1
是Person
类的一个实例。通过person1
可以访问Person
类中定义的方法和属性。person1
实际上是一个Person
类的对象,它拥有name
、age
和height
属性,以及sayHello
和get_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
方法
- 创建实例:首先,需要创建
Person
类的一个实例。例如:
person1 = Person("yasaka", 30, 180)
- 调用方法:然后,可以在实例上调用
get_older
方法。例如:
person1.get_older(5)
这个调用会将 person1
的 age
属性增加 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
对象, 其x
和y
分别是两个向量的x
和y
分量的和。
使用:
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__
:使对象可以像函数一样被调用。