小白学python-类

1、一个完整的类的模板:
小白学python-类


2、类属性和实例属性的交互影响:
如果类中有个不可变类型属性,即A.x;A.x值发生改变之后,实例属性a.x也跟着改变;相反,a.x发生改变,是不影响A.x,且a.x发生改变后,不是改变原来的属性,而是生成新的属性,只是同名;
如果类中有个可变的引用类型属性,不管改变了类属性还是实例属性,都相互影响(其实也很好理解);
可以通过类或实例增加和修改属性,A.y = value之后,实例也有了该属性,相反的,a.y = value之后,类没有该属性,这进一步说明类属性不受实例属性左右;


3、命名空间: 名称到对象的映射,是一个字典的实现,键为变量名,值是变量对应的值。各个命名空间是独立没有关系的;
Built-in,内建命名空间,任何模块均可以访问;python解释器启动时创建,一直保留直到解释器退出;
Global,全局命名空间;模块被加载时创建,通常一直保留直到python解释器退出;
Local,局部命名空间;函数被调用时才被创建,但函数返回结果或抛出异常时被删除;
访问全局空间用print globals(),访问局部空间用print locals(),返回的都是dict类型;


4、python支持多继承,即一个类可以有多个父类,class A(B,C);


5、子类调用父类的方法:super(子类名,self).父类方法/属性
实例方法必须通过实例调用,静态方法@staticmethod和类方法@classmethod一般用类调用方法;
静态方法是没有参数的,因此在方法不能添加任何的变量或属性,一般与本类没有什么逻辑性的关系,只是在本类占用一个空间;
类方法是需要传参数的
实例方法的注意点:
①、方法中变量加self与不加self的区别:
小白学python-类
②、
小白学python-类
静态方法:
小白学python-类
类方法:
小白学python-类


6、封装:准备私有化的属性(包括方法、数据)名字前面加双下划线;类内部随意调用,但在外部不能直接调用;
小白学python-类
私有化的访问
小白学python-类


7、特殊方法:__dict__通过dir()可以查看类或方法或实例的属性,其中有个__dict__属性,可查看各个属性对应的值所形成的字典;
类和实例中的属性修改删除,互不影响;
如果没有建立实例属性,而是调用实例.类属性,实际上引用的还是类.类属性
__slots__在类中建立这个属性之后,此类中的__dict__属性就会被取代,其作用是类属性,实例只能访问,不能修改;建立的实例属性不会回传给类,即类无法访问这个实例属性;
__getattr__
小白学python-类
__getattrbute____getattr__区别在于,前者是默认的方法,是报错的起因,后者是不报错;


8、yield与return的区别:用return返回的函数,被调用时,开始执行函数体,遇到return结束函数体;用yield返回的函数,被调用时,没有执行函数体,需要用next()方法开始执行函数体,遇到yield挂起函数体,等待下一个next()引用