前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >随便写写python的特殊方法

随便写写python的特殊方法

作者头像
哒呵呵
发布2018-08-06 15:20:57
2690
发布2018-08-06 15:20:57
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

支持用于生成对象其他表示形式的内置函数(repr(),bytes())

repr()和str()都是返回对象的字符串形式。

class test():
    typecode = 'd'
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        name = 'repr is change'
        return name

我们可以在一个定义类里实现repr方法

v = test(3,4)
repr(v)
Out[12]: 'repr is change'

还有__bool__,__abs__,__eq__,__str__进行重载,记得要注意在文档中说明

下面看看classmethod,staticmethod的方法

class test2():
    @classmethod
    def a(*args):
        return args
    @staticmethod
    def b(*args):
        return args
test2.a()
Out[15]: (__main__.test2,)
test2.b()
Out[16]: ()

我们可以注意到classmethod改变了调用方法的形式,类方法传入的第一个参数是类本身,可以使用这个类重新构建一个实例

staticmethod呢,就是一个函数,只不过恰巧出现在了类里面而已,第一个参数就不是实例本身了

类的私有属性

class test3():

    def _a(*args):
        print(args)

在方法前面加一个_便是这个方法受到保护,但实际上你还是可以访问的,只要这样test._a(),这只是告诉后来人这个方法私有,不是你真的不可以访问了。

class test3():

    def __a(*args):
        print(args)

加两个下划线,python会使用名称改写,从而将这个方法保护起来,例如

dir(test3)

Out[26]:

['__class__',

...

'_test3__a']

方法名称会加上_类名。

此外,__slots__来存储你所想写的实例属性,这样就不需要python的__dict__方法消耗大量内存存储实例属性

class test4():

    __slots__ = ('a', 'b')   
dir(test4)
Out[28]: 
['__class__',
 '__delattr__',
...
 'a',
 'b']

但是注意,如果使用了__slots__,这样的话,每个子类都要定义__slots__,否则解释器就会忽略继承的__slots__

实例就只能调用__slots__列出的属性

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档