1、init
用于初始化对象的属性和状态
当创建一个对象时,Python会自动调用该对象的__init__
方法。
这个方法用于初始化对象的属性和状态,是对象创建过程中的一个重要环节
2、new
# 通常我们不需要重写__new__方法,除非我们正在进行一些非常特殊的操作,例如单例模式等
class MyClass:
def __new__(cls, *args, **kwargs):
instance = super(MyClass, cls).__new__(cls)
# 在这里进行一些额外的初始化操作
return instance
def __init__(self, name):
self.name = name
2、del
删除对象时调用的特殊方法
当一个对象不再被引用时,Python会自动调用该对象的__del__
方法。
这个方法通常用于释放对象所占用的资源,例如关闭文件、断开网络连接等
class MyClass:
def __init__(self):
self.file = open("example.txt", "r")
def __del__(self):
self.file.close()
obj = MyClass()
# 使用obj读取文件内容...
del obj # 删除obj时,会自动调用__del__方法关闭文件
3、setitem
允许对象使用索引运算符 [] 进行赋值
设置对象的指定索引位置的值。
当使用索引赋值操作符 [key] = value
时,Python会自动调用该对象的__setitem__
方法。
这个方法允许你自定义对象中索引位置的值被设置时的行为。
参数:
key (类型): 索引位置的键或标识符。
value (类型): 要设置的值。
class MyList:
def __init__(self):
self.data = []
def __setitem__(self, key, value):
if key 0 or key >= len(self.data):
raise IndexError("Index out of range")
self.data[key] = value
my_list = MyList()
my_list[0] = "apple" # 调用__setitem__方法设置索引0处的值为"apple"
4、getitem
获取对象的指定索引位置的值。
当使用索引取值操作符 value = [key]
时,Python会自动调用该对象的__getitem__
方法。
这个方法允许你自定义对象中索引位置的值被获取时的行为。
参数:
key (类型): 索引位置的键或标识符。
返回值:
返回指定索引位置的值
class MyList:
def __init__(self):
self.data = [1, 2, 3, 4, 5]
def __getitem__(self, key):
if key 0 or key >= len(self.data):
raise IndexError("Index out of range")
return self.data[key]
my_list = MyList()
value = my_list[2] # 调用__getitem__方法获取索引2处的值,返回3
delitem
class MyDictionary:
def __init__(self):
self.data = {"a": 1, "b": 2, "c": 3}
def __delitem__(self, key):
if key in self.data:
del self.data[key]
dictionary = MyDictionary()
del dictionary["b"] # 调用__delitem__方法,删除键为"b"的项
print(dictionary.data) # 输出{"a": 1, "c": 3}
5、setattr
设置对象的属性值。
当使用服务器托管网赋值语句 object.attribute = value
时,Python会自动调用该对象的__setattr__
方法。
这个方法允许你自定义对象属性被设置时的行为。
参数:
name (str): 属性的名称。
value (类型): 要设置的值
class MyClass:
def __init__(self):
pass
def __setattr__(self, name, value):
if name == "secret_value":
raise AttributeError("Cannot set the 'secret_value' attribute")
object.__setattr__(self, name, value)
obj = MyClass()
obj.name = "Alice" # 正常设置属性name的值
obj.secret_value = "123" # 引发AttributeError异常,因为不允许设置secret_value属性
6、getattr
class MyClass:
def __init__(self):
self.name = "Alice"
def __getattr__(self, name):
if name == "age":
return 25 # 返回年龄属性值
raise AttributeError("Attribute not found")
obj = MyClass()
value = obj.name # 正常获取属性name的值,返回"Alice"
value = obj.age # 调用__getattr__方法获取不存在的属性age的值,返回25
value = obj.address # 引发AttributeError异常,因为找不到属性address
7、str
返回对象的字符串表示形式
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
服务器托管网 return f"Name: {self.name}, Age: {self.age}"
person = Person("Alice", 25)
print(person) # 调用__str__方法,输出"Name: Alice, Age: 25"
print(str(person)) # 调用__str__方法,输出"Name: Alice, Age: 25"
8、repr
返回对象的官方字符串表示形式
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person('{self.name}', {self.age})"
person = Person("Alice", 25)
print(person) # 输出"Person('Alice', 25)"
print(repr(person)) # 输出"Person('Alice', 25)"
9、len
返回对象的长度或包含的元素个数
class MyCollection:
def __init__(self):
self.items = []
def add(self, item):
self.items.append(item)
def __len__(self):
return len(self.items)
collection = MyCollection()
collection.add("apple")
collection.add("banana")
print(len(collection)) # 调用__len__方法,输出2
10、iter
通过定义__iter__方法,你可以自定义对象作为迭代器的行为。这在实现可迭代对象时非常有用,例如列表、元组、字典等内置类型都重写了__iter__方法来返回迭代器。需要注意的是,__iter__方法的返回值应该是一个迭代器对象,该迭代器对象能够逐个返回对象的元素
class MySequence:
def __init__(self):
self.items = [1, 2, 3]
def __iter__(self):
return iter(self.items)
sequence = MySequence()
for item in sequence:
print(item) # 输出1、2、3
11、next
通过定义__next__方法,你可以自定义对象作为迭代器的下一个值的返回。这与__iter__方法一起使用,使得对象能够作为迭代器来遍历元素的序列。需要注意的是,__next__方法的返回值应该表示迭代器的下一个值,并且应该与迭代器的类型和状态保持一致
class MySequence:
def __init__(self):
self.items = [1, 2, 3]
def __iter__(self):
return self
def __next__(self):
item = self.items.pop(0)
return item
sequence = MySequence()
for item in sequence:
print(item) # 输出1、2、3
12、call
允许一个对象像函数一样被调用
# 允许和函数一样调用
class MyFunction:
def __init__(self, value):
self.value = value
def __call__(self, increment):
self.value += increment
return self.value
func = MyFunction(5)
print(func(3)) # 调用__call__方法,输出8
13、add()、sub()、mul()
用于定义对象之间的加、减、乘等运算行为
class MyNumber:
def __init__(self, value):
self.value = value
def __add__(self, other):
result = self.value + other.value if isinstance(other, MyNumber) else other
return MyNumber(result)
num1 = MyNumber(5)
num2 = MyNumber(3)
result = num1 + num2 # 调用__add__方法,输出8
14、eq()、ne()、lt()
用于定义对象之间的比较行为
# __eq__()
class MyClass:
def __init__(self, value):
self.value = value
def __eq__(self, other):
if isinstance(other, MyClass):
return self.value == other.value
return False
obj1 = MyClass(5)
obj2 = MyClass(5)
result = obj1 == obj2 # 调用__eq__方法,输出True
# __ne__()
class MyClass:
def __init__(self, value):
self.value = value
def __ne__(self, other):
if isinstance(other, MyClass):
return self.value != other.value
return True
obj1 = MyClass(5)
obj2 = MyClass(5)
result = obj1 != obj2 # 调用__ne__方法,输出False
【Linux】三剑客详解
【Shell编程】-基础(一)
【shell编程】父子shell和特殊变量
【shell编程】-条件判断
【shell编程】特殊命令用法
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
前言: 每次你在游戏中看到玩家排行榜,或者在音乐应用中浏览热门歌单,有没有想过这个排行榜是如何做到实时更新的?当然,依靠 Redis 即可做到。 在技术领域,我们经常听到「键值存储」 这个词。但在 Redis 的世界里,这只是冰山一角。Redis 的对象,不仅…