python的静态方法、类方法与实例方法

话不多说,直接上程序:

a = 111
class A(object):
  a = 1

  def f_instance(self):
    print self.a

  @staticmethod
  def f_static():
    print a

  @classmethod
  def f_class(cls):
    print cls.a

aaa = A()
A.f_class               #1
A().f_class             #1
aaa.f_class            #1
A.f_static()            #111
A().f_static()          #111
aaa.f_static()         #111
A.f_instance()        # TypeError
A().f_instance()      #1
aaa.f_instance()     #1
f_static()               #NameError

aaa.a = 2
A.f_class()            #1
A().f_class()          #1
aaa.f_class()         #1
A.f_static()           #111
A().f_static()         #111
aaa.f_static()         #111
A.f_instance()       # TypeError
A().f_instance()     #1
aaa.f_instance()     #2
f_static()               #NameError

A().a = 2; aaa.a=1   #基于上一步的赋值
A.f_class()              #1
A().f_class()            #1
aaa.f_class()           #1
A.f_static()             #111
A().f_static()           #111
aaa.f_static()          #111
A.f_instance()         # TypeError
A().f_instance()       #1
aaa.f_instance()       #1
f_static()                #NameError

A.a = 10                 #基于上一步的赋值
A.f_class()              #10
A().f_class()            #10
aaa.f_class()            #10
A.f_static()              #111
A().f_static()            #111
aaa.f_static()           #111
A.f_instance()          # TypeError
A().f_instance()        #10
aaa.f_instance()        #1
f_static()                 #NameError

总结如下:

       静态方法 : 和在类外面 定义的方法 效果一样,只不过该方法是类专有的,在外部不可直接访问。类和实例都可以调用。

       类方法 : 相当于所有的 该类的 实例的 “党章”,它的改变 能够影响 之后新的实例中的 实例属性,但是对旧的实例(在类属性改变之前所定义的实例)没有影响。实例也可以调用该方法,和类调用的效果相同,返回的是类属性。

实例方法:只能在实例化之后被调用,只能影响实例属性,不能影响类属性,并且实例属性在被实例化之后不受类方法的影响,实例化之后也不因类属性改变而改变。类不可以调用,会返回TypeError。

时间: 2024-12-05 08:24:41

python的静态方法、类方法与实例方法的相关文章

IOS—静态方法(类方法)和实例方法

1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象    函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类    函数) c).静态方法在堆上分配内存. 3.静态方法和实例方法的区分 a).静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存.事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载.调用的速度基本上没有差别. b).静态方法在堆上分配内存,实例方法在堆栈上.事实上所

IOS基础——静态方法(类方法)和实例方法

1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象    函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类    函数) c).静态方法在堆上分配内存. 3.静态方法和实例方法的区分 a).静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存.事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载.调用的速度基本上没有差别. b).静态方法在堆上分配内存,实例方法在堆栈上.事实上所

Python中的类方法、实例方法、静态方法

类方法 @classmethod 在python中使用较少,类方法传入的第一个参数是 cls,是类本身: 类方法可以通过类直接调用或者通过实例直接调用,但无论哪种调用方式,最左侧传入的参数一定是类本身. 通常情况下,类方法使用 @classmethod 装饰器来声明 实例方法 实例方法需要将类实例化后调用,如果使用类直接调用实例方法,需要显式的将实例作为参数传入:使用实例调用则不需要. 最左侧传入的参数 self,是实例本身. 静态方法 @staticmethod 指类中无需实例参与即可调用的方

python的静态成员变量、实例成员变量、静态方法、类方法、实例方法

静态成员变量(类变量)和普通成员变量(实例变量) 静态成员变量只能通过类名.变量名获得,实例成员变量,通过该实例引用.变量名获得. 在实例对静态成员变量赋值时,实例 python是动态类型的语言,没有特别的标志区分静态成员变量和普通成员变量 如果你使用类名.成员变量    那这个成员变量现在就是静态成员变量(类变量) 如果你使用实例.成员变量    那这个成员变量现在就是普通成员变量(实例变量) 静态方法.类方法.实例方法      实例方法,类中的普通方法,由实例调用 类方法,被@classm

python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法

1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过"类名()"的方式实例化一个对象. 可以通过"类名.类属性"的方式来访问一个类属性. 如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化.实例化,即实例化对象是类对象实例化之后的产物. class Person:# 声明一个类对象 pass p1 = Person()

Python 静态方法 类方法

静态方法和实例方法的区别主要体现在两个方面: 1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就是说,调用静态方法可以无需创建对象. 2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制. 3. 类方法可以被对象调用,也可以被实例调用:传入的都是类对象,主要用于工厂方法,具体的实现就交给子类处理 4. 静态

Python的静态方法和类方法

Python中使用@staticmethod这个装饰器让方法变为静态方法 一:定义 @staticmethod: 首先它是一个装饰器,被装饰的方法不需要隐含的参数,对象和对象的实例都可以调用静态方法 类方法是通过@classmethod进行装饰,被装饰的方法第一个隐含参数是cls,同样对象和对象的实例都可以调用类方法 这里还有一个叫实例方法,实例方法就是实例的方法,它是与实例进行绑定的,只能实例进行调用,第一个隐含参数是self 二:举例说明 翻译自:https://stackoverflow.

python3类方法,实例方法和静态方法

今天简单总结下python的类方法,实例方法,静态方法. python默认都是实例方法,也就是说,只能实例对象才能调用这个方法. 那是不是说类方法也只能被类对象本身来调用呢,当然,不是.类方法既可以被类对象调用,也可以被实例对象调用.你可以这样理解,假设我现在定义的是'dog狗',它有一个类方法'啃骨头',那么对于所有的狗是不是都可以调用啃骨头这个方法,既然这样,我现在创建一个'旺财'实例,它也同样可以去啃骨头,也就是能调用这个类方法. 静态方法你可以理解为参数可以随意设置的方法,类对象和实例对

python静态方法类方法属性方法

Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量: 3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法. 静态方法 @staticmethod    def staticmd():        print '静态方法 @classmetho

IOS:类方法(静态方法)和实例方法

1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象    函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类    函数) c).静态方法在堆上分配内存. 3.静态方法和实例方法的区分 a).静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存.事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载.调用的速度基本上没有差别. b).静态方法在堆上分配内存,实例方法在堆栈上.事实上所