类属性能够直接在方法中赋值,但html
1、调用该属性时,必须先调用该方法;python
2、与 init 方法区别是,init方法只初始化一次,初始化完成后做为全局变量。在方法中赋值属性,每次调用该方法,该属性初始化一次。shell
以下面例子:函数
class A:
def a(self):
self.b=1
aa=A()
aa.b
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-4-dd213296dba2>", line 1, in <module>
aa.b
AttributeError: 'A' object has no attribute 'b'
aa.a()
aa.b
Out[6]: 1
aa.b=2
aa.b
Out[8]: 2
aa.a()
aa.b
Out[10]: 1
属性分为实例属性与类属性this
方法分为普通方法,类方法,静态方法 转载于:http://www.javashuo.com/article/p-zbbsvbpt-mt.htmlspa
一:属性:code
尽可能把须要用户传入的属性做为实例属性,而把同类都同样的属性做为类属性。实例属性在每创造一个实例时都会初始化一遍,不一样的实例的实例属性可能不一样,不一样实例的类属性都相同。从而减小内存。 ###共性就设为类属性,个性的设置为实例属性!!!!htm
1:实例属性:对象
最好在__init__(self,...)中初始化blog
内部调用时都须要加上self.
外部调用时用instancename.propertyname
2:类属性:
在__init__()外初始化
在内部用classname.类属性名调用
外部既能够用classname.类属性名又能够用instancename.类属性名来调用
3:私有属性:
1):单下划线_开头:只是告诉别人这是私有属性,外部依然能够访问更改
2):双下划线__开头:外部不可经过instancename.propertyname来访问或者更改
实际将其转化为了_classname__propertyname
二:方法
1:普通类方法:
def fun_name(self,...):
pass
外部用实例调用
2:静态方法:@staticmethod
不能访问实例属性!!! 参数不能传入self!!!
与类相关可是不依赖类与实例的方法!!
3:类方法:@classmethod
不能访问实例属性!!! 参数必须传入cls!!!
必须传入cls参数(即表明了此类对象-----区别------self表明实例对象),而且用此来调用类属性:cls.类属性名
*静态方法与类方法均可以经过类或者实例来调用。其两个的特色都是不可以调用实例属性
e.g1:
class A: member='this is a test'
def __init__(self): pass @classmethod def Print1(cls): print('print 1:',cls.member) def Print2(self): print('print 2:',self.member) @classmethod def Print3(paraTest): print('print 3:',paraTest.member) @staticmethod def Print4(): print('hello') a=A() print(a.Print1()) print(a.Print2()) print(a.Print3()) print(a.Print4()) #print 1: this is a test #None #print 2: this is a test #None #print 3: this is a test #None #hello #None
静态方法和类方法的异同点 https://www.cnblogs.com/wcwnina/p/8644892.html
member和init下定义的实例属性区别不大,一个是自带的(每一个实例固定死),一个是初始化的(做为参数传递进实例)。
总结:类属性与类方法是类固有的方法与属性,不会由于实例不一样而改变,写他们的目的是减小多实例时所创造出来的内存空间,加快运行速度。
一个常见的错误在介绍具体的模板函数以前先看一个常见的错误我通俗易懂的总结一下:Python中的对象分为可变对象(如dict、list等数据容器)以及不可变对象(如str、int等数据类型),在init之上定义的可变对象变量在实例初始化的时候会直接指向该类的同名变量,致使多个实例间共享了同一个数据容器,也就会致使各类诡异的出错状况。为了解决这个问题,请将全部可变变量的定义(尤为是list、dict等数据容器),放到init函数中(不要放在类的成员定义中)。vnpy