类属性实例属性

Posted Utee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类属性实例属性相关的知识,希望对你有一定的参考价值。

属性分为实例属性与类属性

方法分为普通方法,类方法,静态方法

一:属性:

  尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。实例属性在每创造一个类是都会初始化一遍,不同的实例的实例属性可能不同,不同实例的类属性都相同。从而减少内存。

  1:实例属性:

    最好在__init__(self,...)中初始化

    内部调用时都需要加上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.类属性名

  *静态方法与类方法都可以通过类或者实例来调用。其两个特点都是不能够调用实例属性

1.先看下静态方法和类方法

 1 """
 2 静态方法和类方法
 3 已知,类的方法第一个参数必须是self,并且如果要调用类的方法,必须将通过类的实例,即方法绑定实例后才能由实例调用。
 4 如果不绑定,一般在继承关系的类之间,可以用super函数等方法调用。
 5 
 6 这里再介绍一种方法,这种方法的调用方式跟上述的都不同,这就是:静态方法和类方法。看代码:
 7 """
 8 class StaticMethod:     
 9     @staticmethod       #静态方法
10     def foo():
11         print "This is static method foo()"
12 
13 class ClassMethod:     
14     @classmethod        #类方法
15     def bar(cls):
16         print "this is class method bar()"
17         print "bar() is part of class:",cls.__name__
18 
19 if __name__ == "__main__":
20     static_foo = StaticMethod()  #实例化
21     static_foo.foo()                  #实例调用静态方法
22     StaticMethod.foo()              #通过类来调用静态方法
23     print "*********"
24     class_bar = ClassMethod()   #实例化
25     class_bar.bar()                    #实例调用类方法
26     ClassMethod.bar()               #通过类直接调用类方法

 

2.静态方法和类方法调用实例属性(测试代码)

 1     class A:  
 2         member = "this is a test."  
 3         def __init__(self):  
 4             pass  
 5      
 6         @classmethod  
 7         def Print1(cls):  
 8             print "print 1: ", cls.member  
 9               
10         def Print2(self):  
11             print "print 2: ", self.member  
12                 
13              
14         @classmethod      
15         def Print3(paraTest):  
16             print "print 3: ", paraTest.member  
17         @staticmethod  
18         def print4():  
19             print "hello"  

报错信息:

AttributeError: type object ‘A1‘ has no attribute ‘scord‘

 

以上是关于类属性实例属性的主要内容,如果未能解决你的问题,请参考以下文章

面向对象的成员: 实例变量 类变量 实例方法 类方法 静态方法 属性 私有

Python高级语法-对象实例对象属性-类与实例,class方法静态方法等(4.6.1)

php 实例化 问题

python之路之前没搞明白4面向对象(封装)

类方法与类属性

利用反射获取一个类实例的所有属性名称和值 拼接为字符串