59. 类有哪些内置的属性?

在Python3.0以上版本里面,所有的类都是默认从Object继承而来。那他就会带有Object的属性。 我们可以通过dir()函数来查看。我们可以写一个简单的类来查看其属性。:

class Book:
    pass

print(dir(Book))
#输出内容为:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', '__weakref__']
book = Book()
print(dir(book))

我们由浅入深,以及是否常用来逐个来介绍其含义和用法。

  • ‘__doc__’ 是类的文档字符串,help函数会把这部分内容进行输出。

  • ‘__dict__’ 用于存储可写属性的词典。

  • ‘__module__’ 定义这个类的模块名称。

  • ‘__eq__’ “equal”的缩写,等于比较”==”调用这个方法。

  • ‘__ge__’ “greater than or equal”的缩写, 大于等于”>=”调用这个方法。

  • ‘__gt__’ “greater than”的缩写, 大于比较”>”调用这个方法。

  • ’__le__’ “less than or equal”的缩写, 小于或等于”<=”调用这个方法。

  • ‘__lt__’ “less than”的缩写,小于比较”<”就调用这个方法。

  • ’__ne__’ “not equal”的缩写,不等于比较”!=”调用这个方法。

  • “__class__”, 实例所属的类

  • “__hash__” 返回对象的散列函数值。如果两个对象通过”__eq__”比较相等,那 其散列后的值也必须相同,如果我们没有自己实现”__hash__”, 那散列值和其实际 地址相关。

  • “__new__” 在创建新实例时被调用,它是一个静态方法。

  • “__init__” 在实例创建后被调用,但是在返回给用户之前。它返回None。

  • “__sizeof__” 在自定义类型时,如果使用sys.getsizeof()函数获取对象大小可能不准 我们需要重写__sizeof__函数来计算对象大小。

对于我们自定义类,如果我们要比较对象,我们需要自己来实现这些方法。例如两本书 使用价格来比较大小

class Book:
    """Class Book demo"""
    def __init__(self, price):
        self.price = price

    def __gt__(self, other):
        return self.price>other.price

b= Book(10)
c= Book(20)
print("book:")
print(c>b)

通常如果实现“__gt__”,那其他5个函数也需要实现。

还有一些是不在dir函数中显示的方法,

  • __bases__ 类的基类构成的元组

  • “__name__” 类的名称,是一个字符串

  • “__del__” 在对实例进行del时,该成员函数被调用。

例如”__name__”:

print(Book.__name__) #输出Book, 这是类属性。