小白学python-类
1、一个完整的类的模板:
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的区别:
②、
静态方法:
类方法:
6、封装:准备私有化的属性(包括方法、数据)名字前面加双下划线;类内部随意调用,但在外部不能直接调用;
私有化的访问
7、特殊方法:__dict__
通过dir()
可以查看类或方法或实例的属性,其中有个__dict__
属性,可查看各个属性对应的值所形成的字典;
类和实例中的属性修改删除,互不影响;
如果没有建立实例属性,而是调用实例.类属性
,实际上引用的还是类.类属性
; __slots__
在类中建立这个属性之后,此类中的__dict__
属性就会被取代,其作用是类属性,实例只能访问,不能修改;建立的实例属性不会回传给类,即类无法访问这个实例属性; __getattr__
__getattrbute__
与__getattr__
区别在于,前者是默认的方法,是报错的起因,后者是不报错;
8、yield与return的区别:用return返回的函数,被调用时,开始执行函数体,遇到return结束函数体;用yield返回的函数,被调用时,没有执行函数体,需要用next()方法开始执行函数体,遇到yield挂起函数体,等待下一个next()引用