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 条评论
登录 后参与评论

相关文章

来自专栏osc同步分享

java的静态属性,静态块,构造函数的执行顺序

今天为了搞清楚实例化一个对象时其属性等的实例化顺序,写了下面的例子来探究: 实例化一个C的对象,其中,A为其静态属性,B为其普通属性;D为C的父类,E为D的静态...

3236
来自专栏从流域到海域

C++对象的赋值和复制

本文属于上篇博文《C++区别于其他语言的知识点总结》第13小节。 13.对象的赋值和复制 对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号...

1789
来自专栏个人随笔

房上的猫:StringBuffer类

一.使用StringBuffer类  StringBuffer类位于java.lang包中,是String类的增强类  步骤:   1.声明StringBuff...

33415
来自专栏Linux驱动

指针学习(详解)

在指针中*是取内容,&是取地址 (在结构体中时:变量结构体用".",指针结构体用"->") 通常有两种的表示: 1. 通过指针向指向的地址内容赋值 *p=a;...

1605
来自专栏游戏杂谈

C++学习笔记 -- 虚析构函数与纯虚析构函数

一个类维护一个虚函数相关的表--vtable(__vfptr指向它),函数声明前面包含关键字“virtual”的函数,就会创建一个指向该函数的指针(函数指针)被...

694
来自专栏行者常至

构造代码块、构造函数、静态代码块 学习笔记

971
来自专栏大闲人柴毛毛

稳扎稳打JS——自由变量

自由变量的作用域在程序运行前就已经确定! 自由变量相当于Java中的全局变量,它在外层作用域中声明,但在内层作用域中使用,如下所示: var a = 1; f...

3467
来自专栏龙首琴剑庐

Java可变参数列表

1、接受的传入参数情况 如public void test(String ...args){...}  1)不使用参数,如test() 2)使用一个或多个参数,...

2947
来自专栏LanceToBigData

JavaSE(四)之接口、访问控制

上面我们学习了几个修饰符,在开发中经常会用的到,所以必须熟练的掌握。接下来我学习一下接口和访问控制。 一、接口 一系列方法的声明,是一些方法特征的集合,一个接口...

2157
来自专栏C/C++基础

C++多态的两种形式

多态(Polymorphisn)是面向对象程序设计(OOP)的一个重要特征。多态字面意思为多种状态。在面向对象语言中,一个接口,多种实现即为多态。C++中的多态...

751

扫码关注云+社区