class提供的内置方法

回顾 :自省

hasattr(obj,‘属性’) #obj.属性 是否存在
getattr(obj,‘属性’) #获取obj.属性 不存在则报错
getattr(obj,‘属性’,‘默认值’) #获取obj.属性 不存在不会报错,并返回默认值
setattr(obj,‘属性’,‘属性的值’) #obj.属性=属性的值
delattr(obj,‘属性’) #del obj.属性

class提供的内置函数(不重写则执行系统默认的)

除了__ getattr__(可用来做授权功能)其他的很少用

__getattr__、__setattr__、__delattr__

obj点的方式去操作属性时触发的方法
注:这里的这些和上面自省的是没有联系的

__getattr__:obj.属性 不存在的时候触发
__setattr__:obj.属性=属性的值 时触发
__delattr__:del obj.属性 时触发

__getitem__、__setitem__、__delitem__

obj[‘属性’]的方式去操作属性时触发的方法

__getitem__:obj['属性']  时触发
__setitem__:ob['属性']=属性的值 时触发
__delitem__:del obj['属性'] 时触发

__get__、__set__、__delete__

描述就是一个新式类,这个类至少要实现上述三个方法的一个

class 描述符:
	def __get__():
		pass
	def __set__():
		pass
	def __delete__():
		pass
class 类:
	name=描述符()
obj=类()
obj.name #触发get
obj.name='alex' #触发set
del obj.name #触发delete

__str__、__repr__

'''
当类中没有__str__时,它默认打印内容如下,对于使用者来说有用的信息只有__main__.Foo
当我们回想要他打印的只有有用给的信息或者其他需要的信息,这时就需要用到__str__
'''

class Foo:
    pass
f1=Foo()
print(f1)

结果:

<__main__.Foo object at 0x000000C96C398EB8>
#注:__str__()返回的只能是字符串
class Bar:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return 'Bar(%s,%s)'%(self.name,self.age)
b1=Bar('alex',18)
print(b1)
str(b1)#-->b1.__str__()

结果:

Bar(alex,18)
'Bar(alex,18)'
class Foo:
    def __repr__(self):
        return 'as123'
f1=Foo()
print(f1)

结果:as123

__slots__

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
然后,我们试试:

>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

__doc__

查看类的文档信息

class Foo:
    '我是描述信息'
    pass

class Bar(Foo):
    pass
print(Foo.__doc__)
print(Bar.__doc__) #该属性无法继承给子类

结果:

我是描述信息
None

__module__、__class__

查看对象在哪个模块,查看对象是由哪个类产生的

class C:

    def __init__(self):
        self.name = ‘SB'
from lib.aa import C

obj = C()
print obj.__module__  # 输出 lib.aa,即:输出模块
print obj.__class__      # 输出 lib.aa.C,即:输出类

__call__

对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
    def __init__(self):
        pass    
    def __call__(self, *args, **kwargs):
        print('__call__')
obj = Foo() # 执行 __init__
obj()       # 执行 __call__
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值