Python 内置类属性

在python中内置类写类属性,即只要你新建了类,系统就会自动创建这些属性。下面就来讲解一下这些自带的属性。

>>> class Peopre(object):
...     pass
... 
>>> dir(Peopre)
['__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__']

下面是常用的几个属性

常用专有属性说明触发方式
__init__构造初始化函数创建实例后,赋值时使用,在__new__
__new__生成实例所需属性创建实例时
__class__实例所在的类实例.__class__
__str__实例字符串表示,可读性print(类实例),如没实现,使用repr结果
__repr__实例字符串表示,准确性类实例 回车 或者 print(repr(类实例))
__del__析构del删除实例
__dict__实例自定义属性vars(实例.__dict__)
__doc__类文档,子类不继承help(类或实例)
__getattribute__属性访问拦截器访问实例属性时
__delattr__(s,name)删除name属性调用时
__gt__(self,other)判断self对象是否大于other对调用时
__setattr__(s,name,value)设置name属性调用时
__gt__(self,other)判断self对象是否大于other对象调用时
__lt__(slef,other)判断self对象是否小于other对象调用时
__ge__(slef,other)判断self对象是否大于或者等于other对象调用时
__le__(slef,other)判断self对象是否小于或者等于other对象调用时
__eq__(slef,other)判断self对象是否等于other对象调用时
__call__(self,\*args)把实例对象作为函数调用调用时

下面将讲解几个常用的:

__init__():
_ init_方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。注意,这个名称的开始和结尾都是双下划线。

class Person:
    def __init__(self, name):
        self.name = name
    def sayHi(self):
        print ('Hello, my name is', self.name)

  说明:_ init_ 方法定义为取一个参数name(以及普通的参数self)。在这个_ init_ 里,我们只是创建一个新的域,也称为name。注意它们是两个不同的变量,尽管它们有相同的名字。点号使我们能够区分它们。最重要的是,我们没有专门调用_ init_ 方法,只是在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给_ init_ 方法。这是这种方法的重要之处。现在,我们能够在我们的方法中使用self.name域。这在sayHi方法中得到了验证。

__new__ ()
  _ new_ ()在_ init_()之前被调用,用于生成实例对象.利用这个方法和类属性的特性可以实现设计模式中的单例模式.单例模式是指创建唯一对象吗,单例模式设计的类只能实例化一个对象.

class Singleton(object):
    __instance = None                       # 定义实例

    def __init__(self):
        pass

    def __new__(cls, *args, **kwd):         # 在__init__之前调用
        if Singleton.__instance is None:    # 生成唯一实例
            Singleton.__instance = object.__new__(cls, *args, **kwd)
        return Singleton.__instance

__str__ ()
  _ str_ ()用于表示对象代表的含义,返回一个字符串.实现了_ str_ ()方法后,可以直接使用print语句输出对象,也可以通过函数str()触发_ str_ ()的执行.这样就把对象和字符串关联起来,便于某些程序的实现,可以用这个字符串来表示某个类

class Cat:
    """定义了一个Cat类"""

    #初始化对象
    def __init__(self, new_name, new_age):
        self.name = new_name
        self.age = new_age

    def __str__(self):
        return "%s的年龄是:%d"%(self.name, self.age)

__del__()

  _ del_称作析构方法
  析构方法,当对象在内存中被释放时,自动触发执行。
    注:此方法一般无须定义,因为在Python中,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。在程序执行结束之后,执行此方法

class Foo:

    def __del__(self):
        print('run __del__')

__getattribute__:

class Itcast(object):
    def __init__(self,subject1):
        self.subject1 = subject1
        self.subject2 = 'cpp'

    #属性访问时拦截器,打log
    def __getattribute__(self,obj):
        if obj == 'subject1':
            print('log subject1')
            return 'redirect python'
        else:   #测试时注释掉这2行,将找不到subject2
            return object.__getattribute__(self,obj)

    def show(self):
        print('this is Itcast')

s = Itcast("python")
print(s.subject1)
print(s.subject2)

运行结果:

log subject1
redirect python
cpp

__getattribute__的坑

    class Person(object):
        def __getattribute__(self,obj):
            print("---test---")
            if obj.startswith("a"):
                return "hahha"
            else:
                return self.test


        def test(self):
            print("heihei")


    t.Person()

    t.a #返回hahha

    t.b #会让程序死掉
        #原因是:当t.b执行时,会调用Person类中定义的__getattribute__方法,但是在这个方法的执行过程中
        #if条件不满足,所以 程序执行else里面的代码,即return self.test  问题就在这,因为return 需要把
        #self.test的值返回,那么首先要获取self.test的值,因为self此时就是t这个对象,所以self.test就是
        #t.test 此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去执行,即此时产
        #生了递归调用,由于这个递归过程中 没有判断什么时候推出,所以这个程序会永无休止的运行下去,又因为
        #每次调用函数,就需要保存一些数据,那么随着调用的次数越来越多,最终内存吃光,所以程序 崩溃
        #
        # 注意:以后不要在__getattribute__方法中调用self.xxxx
### Python 的内置方法和属性 #### 内置属性 Python 中的拥有一些特殊的内置属性,这些属性通过双下划线包围来与其他普通属性区分开。以下是常见的几个: - `__name__`:表示当前定义的的名字[^2]。 - `__module__`:表示该或对象所属的模块名[^2]。 - `__dict__`:这是一个字典,包含了或对象的所有可变属性。对于而言,这包括其数据属性;而对于实例,则可能还包括动态添加的属性。 - `__doc__`:这是或对象的文档字符串,通常位于 class 关键词之后的第一条语句中,用于描述的功能和用途。 - `__bases__`:如果是一个的话,这个属性会给出一个元组形式的结果,里面包含着所有的基(即父)。如果是新式,则至少有一个 base 是 object。 ```python class ExampleClass: """This is an example of how to use built-in attributes.""" print(ExampleClass.__name__) # 输出: ExampleClass print(ExampleClass.__module__) # 输出: __main__ print(ExampleClass.__doc__) # 输出: This is an example... print(tuple([cls.__name__ for cls in ExampleClass.__bases__])) # 输出 ('object',) ``` #### 内置方法 除了上述提到的特殊属性外,Python 的每一个还继承自基础对象 `object` ,因此具有许多默认可用的方法。这里列举一些常用的方法及其功能说明: - `__new__(cls[, ...])`: 负责创建并返回一个新的实例。此静态方法是在调用构造器时被自动触发执行的第一个操作,并且在大多数情况下不需要重载它除非有特别需求[^3]。 - `__init__(self, ...)`: 初始化新建的对象,在每次创建新的实例化对象的时候都会被执行一次。可以用来设置初始状态或分配资源给新建立的对象[^1]。 - `__str__(self)` 和 `__repr__(self)`: 返回关于对象的一个易于阅读的人友好型表达方式(`__str__()`) 或者更正式的技术性表述 (`__repr__()`) 。这两个魔术方法有助于调试以及日志记录等功能实现。 - `__eq__(self, other), __ne__(self, other)...` : 实现比较运算符的行为逻辑,比如等于 (==),不等于 (!=) 等等。 - `__getattr__(self, name), __setattr__(self, name, value)...` :控制访问不存在/存在的属性行为,允许开发者定制获取、设定成员变量的方式。 ```python class MyClass(object): def __init__(self, val=None): self.val = val def __str__(self): return f"MyClass instance with value {self.val}" mc = MyClass('test') print(mc) # 使用 __str__() print(str(MyClass())) # 默认输出 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值