Python中如何访问内置类的哪些属性?
- 内容介绍
- 文章标签
- 相关推荐
本文共计994个文字,预计阅读时间需要4分钟。
一、使用 __slots__ 优化类
当类中定义了 __slots__ 后,Python 会为该类的实例预分配固定数量的属性,从而减少内存占用。以下是一个使用 __slots__ 的示例:
pythonclass Person(object): __slots__=['name', 'age']
def __init__(self, name, age): self.name=name self.age=age
p=Person('lucy', 18)p.city='上'
二、不使用 __slots__ 的类
如果不使用 __slots__,Python 会为每个实例动态创建属性,这样会导致内存占用增加。以下是不使用 __slots__ 的示例:
pythonclass Person(object): def __init__(self, name, age): self.name=name self.age=age
p=Person('lucy', 18)p.city='上'
一、__slots__
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
p.city = '上海'
print(p.city) # 上海
__slots__ = ('name', 'age', 'sex')
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
p.sex = '男'
p.city = '上海' # 报错
print(p.sex) # 男
二、__doc__
"""
这是类的文档信息
"""
__slots__ = ('name', 'age', 'sex')
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
print(p.__doc__) # 对象名.__doc__
print(Person.__doc__) # 类名.__doc__
三、__module__
test.py中的代码如下:
class Person(object):__slots__ = ('name', 'age', 'sex')
def __init__(self, name, age):
self.name = name
self.age = age
demo.py中的代码:
import testp = test.Person('lucy', 18)
print(p.__module__) # test
四、__class__
__slots__ = ('name', 'age', 'sex')
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
print(p.__class__) # <class '__main__.Person'>
五、__dict__
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
print(p.__dict__) # {'name': 'lucy', 'age': 18}
六、__dir__()
__slots__ = ('name', 'age')
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
print(p.__dir__())
print(dir(p))
七、__setitem__方法
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
p = Person('张三', 18, '襄阳')
# 我想把age修改成20,会报错
p['age'] = 20 # [] 语法会调用对象的 __setitem__方法
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
def __setitem__(self, key, value):
self.__dict__[key] = value
p = Person('张三', 18, '襄阳')
p['age'] = 20
p['sex'] = '男'
print(p.__dict__) # {'name': '张三', 'age': 20, 'city': '襄阳', 'sex': '男'}
八、__getitem__方法
class Person(object):def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
def __getitem__(self, item):
return self.__dict__[item]
p = Person('张三', 18, '襄阳')
print(p['name']) # 张三
九、__delitem__方法
class Person(object):def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
def __delitem__(self, key):
print(f'删除的属性{key}')
p = Person('张三', 18, '襄阳')
del p['city'] # 删除的属性city
本文共计994个文字,预计阅读时间需要4分钟。
一、使用 __slots__ 优化类
当类中定义了 __slots__ 后,Python 会为该类的实例预分配固定数量的属性,从而减少内存占用。以下是一个使用 __slots__ 的示例:
pythonclass Person(object): __slots__=['name', 'age']
def __init__(self, name, age): self.name=name self.age=age
p=Person('lucy', 18)p.city='上'
二、不使用 __slots__ 的类
如果不使用 __slots__,Python 会为每个实例动态创建属性,这样会导致内存占用增加。以下是不使用 __slots__ 的示例:
pythonclass Person(object): def __init__(self, name, age): self.name=name self.age=age
p=Person('lucy', 18)p.city='上'
一、__slots__
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
p.city = '上海'
print(p.city) # 上海
__slots__ = ('name', 'age', 'sex')
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
p.sex = '男'
p.city = '上海' # 报错
print(p.sex) # 男
二、__doc__
"""
这是类的文档信息
"""
__slots__ = ('name', 'age', 'sex')
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
print(p.__doc__) # 对象名.__doc__
print(Person.__doc__) # 类名.__doc__
三、__module__
test.py中的代码如下:
class Person(object):__slots__ = ('name', 'age', 'sex')
def __init__(self, name, age):
self.name = name
self.age = age
demo.py中的代码:
import testp = test.Person('lucy', 18)
print(p.__module__) # test
四、__class__
__slots__ = ('name', 'age', 'sex')
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
print(p.__class__) # <class '__main__.Person'>
五、__dict__
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
print(p.__dict__) # {'name': 'lucy', 'age': 18}
六、__dir__()
__slots__ = ('name', 'age')
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('lucy', 18)
print(p.__dir__())
print(dir(p))
七、__setitem__方法
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
p = Person('张三', 18, '襄阳')
# 我想把age修改成20,会报错
p['age'] = 20 # [] 语法会调用对象的 __setitem__方法
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
def __setitem__(self, key, value):
self.__dict__[key] = value
p = Person('张三', 18, '襄阳')
p['age'] = 20
p['sex'] = '男'
print(p.__dict__) # {'name': '张三', 'age': 20, 'city': '襄阳', 'sex': '男'}
八、__getitem__方法
class Person(object):def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
def __getitem__(self, item):
return self.__dict__[item]
p = Person('张三', 18, '襄阳')
print(p['name']) # 张三
九、__delitem__方法
class Person(object):def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
def __delitem__(self, key):
print(f'删除的属性{key}')
p = Person('张三', 18, '襄阳')
del p['city'] # 删除的属性city

