python class 一点总结

Python class 总结

细数class中的 __**__

  • __init__(self, *values) 对象的初始化函数,初始化类的实例时,会调用这个方法
  • __str__(self) 返回 print对象时要打印的东西,pirnt(obj)时会调用这个方法
  • __iter__(self)__next__(self) 将对象 变为可迭代对象,__iter__()用于iter(),__next__用于next()
  • __getitem__(self, key) 使得对象可以向类表一样使用,obj[2], obj[2:4]
  • __setitem__(self, key, value) 可以使对象的key被赋值
obj['hello'] = 'world'
  • __getattr__(self, attr) 如果对象没有所调用的属性的时候,就会把属性名送进这个方法,看看这个方法返回什么
  • __getattribute__(self, item) 所有的属性访问都会经过这个接口
class People(object):
    def __init__(self):
        self.name = "h"

    def __getattribute__(self, item):
        print("get->",item)
        return object.__getattribute__(self,item)

    def __getattr__(self, item):
        print("hello")

    def m(self):
        self.name = 'a'

p = People()
p.m()
print(p.name)
# get-> m
# get-> name
# a
  • __setattr__(self, name, value) 当每次给一个属性赋值的时候,就会调用这个方法
class People(object):
    def __init__(self):
        self.name = "h"

    def __setattr__(self, key, value):
        super(People, self).__setattr__(key,value)
        #self.__dict__[key] = value
        print("hello")
    def m(self):
        self.name = 'a'

p = People()
p.m()
print(p.name)
# hello
# hello
# a 
  • __call__(self, *value) 使得类的实例可以像函数一样被调用
  • __len__(self) 当执行len(obj)时,被调用
  • __slots__ 这个和前几个不太一样,它是个类的属性,不是方法,这个用来限制类的实例所能动态添加的属性

细数用在class中的装饰器

  1. @property 是一个装饰器,将一个方法当作属性调用
  2. @staticmethod 将方法定义成静态方法,不需要传入self
  3. @classmethod 将一个方法定义成类方法,传入cls而不是self
  4. @abstraction 将一个方法声明成抽象方法

参考资料

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186781871161bc8d6497004764b398401a401d4cce000 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319098638265527beb24f7840aa97de564ccc7f20f6000 https://jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/ http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python https://docs.python.org/3/library/functions.html#setattr

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JetpropelledSnake

Python入门之面向对象编程(三)Python类的魔术方法

python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法。这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功...

2704
来自专栏python3

python3--元组(tuple),列表(list),字典dict,其它(for,enumerate,range)

元组被称为只读列表,即数据可以被查询,但不能被修改,所以,字符串的切片操作同样适用于元组

761
来自专栏开源优测

[快学Python3]迭代器和生成器

迭代器 迭代是Python最强大的功能特色,是遍历访问序列元素的一种方式。 迭代器的特性是: 可以记住当前遍历位置 只能往前遍历,不能后退 从序列的第一个元素开...

2567
来自专栏我的博客

sizeof用法

sizeof()功能:计算数据空间的字节数 1.与strlen()比较 strlen()计算字符数组的字符数,以”\0″为结束判断,不计算为’\...

2604
来自专栏编程坑太多

python--面向对象与模块补充,反射

1534
来自专栏我爱编程

Day6函数式编程2/3

返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 实现一个可变参数的求和。 def lazy_sum(*args):...

3366
来自专栏测试开发架构之路

总结了一些指针易出错的常见问题(六)

  安全问题与指针误用 声明和初始化指针(初始化失败) 误用指针 释放问题 指针声明: // 宏定义(仅仅是替换) #define PINT int*; PIN...

33613
来自专栏十月梦想

对象的属性方法调用的两种方法

412
来自专栏nnngu

JAVA有哪些数据类型?基本数据类型各占多少个字节

java的数据类型分为:基本数据类型和引用数据类型。 ? 基本数据类型各占多少个字节: 数据类型 字节 默认值 byte 1 0 short 2 ...

2908
来自专栏开源优测

[快学Python3]迭代器和生成器

迭代器 迭代是Python最强大的功能特色,是遍历访问序列元素的一种方式。 迭代器的特性是: 可以记住当前遍历位置 只能往前遍历,不能后退 从序列的第一个元素开...

2616

扫码关注云+社区