2 Python 类,实例,静态方法

本文详细介绍了Python中类与实例的概念及其使用方式,包括实例变量、构造器、实例方法、类属性、静态变量、静态方法及类方法等内容,并通过实例说明它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类,实例,静态方法

转载请标明出处(http://blog.youkuaiyun.com/lis_12/article/details/52693285)

类与实例

类名通常由大写字母开头.

实例变量

  • 类与实例相互关联着:类是对象的定义,而实例是真正的实物.它存放了类中所定义的对象的具体信息.
  • 类既可以很简单,也可以很复杂.最简单的情况下,类仅仅用作名称空间(namespace).这样就是把数据放到了变量中,对他们按照名称空间进行分组,使得他们处于同样的关系空间中(点属性标识).
  • 将实例与方法、变量严格绑定在了一起,没有实例的时候不能调用实例变量和方法.
  • 构造器是最早设立实例属性的地方,因为__init__()函数是实例创建后第一个被调用的函数.
'''这个类没有任何方法和属性,只被用作名称空间容器'''
class namespace(object):
    pass

a = namespace()
b = namespace()
print dir(a)
'''['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
以上为object的属性和方法'''
a.x = 10
a.y = 11
print dir(a)
'''['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x', 'y']'''
#多了x,y  a.x,a.y为实例属性,并不是类属性
print b.x # error,因为上述的x为实例a的实例属性,是实例a的独有属性,与b无关.

实例方法

class Test(object):
    def  __init__(self,a):
        self.n = a
    def fun(self,a):
        print a,self.n
t = Test(2)
t.fun(1)
'''
self这个参数代表实例对象本身,当用实例调用方法的时候,解释器会自动传递给方法;
Test的fun函数有两个参数,第一个参数self解释器自动传的,如果函数中的参数没有self参数,该函数不能调用实例属性;
self类似于c++中的this
'''

类属性

  • 类和实例读书名字空间.类是类属性的名字空间,实例则是实例属性的空间.
  • 访问属性时,首先会检测实例属性;如果未找到该属性则会在类属性中继续查找.
class Test(object):
    version = 1

 a =  Test()
 b = phonebook()
 print a.version,b.version  # 1  1

 a.version = 41             #相当于给a增加了一个叫version的实例属性,这样就访问不到Test.version了,a.version不再引用Test.version,此时a.version引用41
 print a.version,b.version  #41  1 

 print Test.version         #1
 '''
 实例属性覆盖了对类属性的引用,但是对类属性来说没有任何影响,仍然存在于类域中,还是可以通过类属性来访问   
 '''
 Test.version = 100         #只能通过这种方式修改类属性
 print a.version,b.version  #41 100

 del a.version              #删除实例属性,然后就能访问到类属性了.
 print a.version,b.version  # 100 100

注:类属性最好通过类属性来修改,而不要通过实例属性来修改,不然会出现意想不到的错误!!!!!

静态变量

静态属性是与他们所属的类对象绑定的,不依赖任何类实例.相当于c++中的static。

ps:在python里貌似把静态变量归属于类属性里面了.

class Test():
    self.a = 100 #error,因为不知道self是什么,并没有像参数一样传进来,实例属性最早是在__init__中实现
    var = 1  #静态变量,前面没有self

var = Test.var
print var
Test.var = 100
print Test.var

方法

绑定方法

存在一个实例可以调用此方法,大部分情况下,调用的都是绑定的方法,即实例方法.

非绑定方法

不用实例就可以调用的方法

如子类覆盖父类的构造方法

class A(B):
    def __init__(self):
        B.__init__(self)

静态方法

def Test(object):
    def static_fun():
        print 'static'
        static_fun = staticmethod(static_fun)
#上述写法太low了,装饰器闪亮登场--!(装饰器待讲,先知道有这个东西....)
def Test(object):
    @staticmethod
    def static_fun():
        print 'static'

类方法

def Test(object):
    def class_fun(cls):
        print 'class'
    class_fun = classmethod(class_fun)
'''
cls作为参数代表着本类
'''
def Test(object):
    @classmethod
    def class_fun(cls):
        print 'class'

example code

class Test():
    def __init__(self):
        self.a = 100

    def fun(self):
        print 'self',self.a
        #static_fun() error
        Test.static_fun() #right
        #cls_fun() error
        Test.cls_fun()#right

    @staticmethod
    def static_fun():
        print 'static'
        #fun() error
        #cls_fun() error

    @classmethod
    def cls_fun(cls):
        print 'cls'
        #fun() error
        #static_fun() error

    def test(self,cls):
        self.fun()
        cls.static_fun()
        cls.cls_fun()

if __name__ == '__main__':#主程序
    a = Test()
    a.fun()
    a.static_fun()
    a.cls_fun()
    a.test(Test)
'''
上述错误大部分是因为没有传入参数self(实例),cls(类)
静态方法需要由类.fun或者实例变量.fun来调用
'''

感觉静态方法和类方法很相似啊- -只不过一个需要传递参数,一个不需要啊- -

类方法,静态方法区别

补充:找到了静态方法和类方法的区别了,直接见代码吧…

#!/usr/bin/python
# -*- coding: utf-8 -*-

class A(object):
    def fun(self):
        print "This is A"

    @staticmethod
    def static_f():
        return A()

    @classmethod
    def class_f(cls):
        return cls()

class B(A):
    def fun(self):
        print "This is B"


if __name__ == '__main__':
    a = B.static_f()
    b = B.class_f()
    a.fun()  #This is A
    b.fun()  #This is B
    raw_input()

当使用类方法和静态方法创建对象时,类方法更灵活一些…另外静态方法和类方法与实例方法存储在同一命名空间,这也是与其他面向对象语言(如ruby)的区别之一,这些语言都是将类方法与实例方法严格分开的.

### Python类方法实例方法静态方法的区别及用法 #### 1. 定义与特点 - **实例方法 (Instance Method)** 实例方法是绑定到对象的方法,第一个参数通常是 `self`,表示当前的实例对象。它主要用于访问修改实例属性以及调用其他实例方法[^2]。 - **类方法 (Class Method)** 类方法的第一个参数是 `cls`,代表当前的本身。通过装饰器 `@classmethod` 声明,它可以用来操作变量或实现工厂模式[^1]。 - **静态方法 (Static Method)** 静态方法既不接收 `self` 参数也不接收 `cls` 参数,因此无法访问实例的相关数据。它是通过装饰器 `@staticmethod` 声明的一个普通的函数,通常用于封装一些工具性的功能[^4]。 --- #### 2. 调用方式 - **实例方法** 只能通过实例对象调用。例如: ```python obj = MyClass("Instance Variable") obj.instance_method() ``` - **类方法** **静态方法** 则既可以由对象也可以由实例对象调用。如果通过实例对象调用,则会自动转换为通过对象调用[^5]。例如: ```python MyClass.class_method() # 通过对象调用 obj = MyClass("Instance Variable") obj.class_method() # 通过实例对象调用 ``` 对于静态方法: ```python MyClass.static_method() # 通过对象调用 obj = MyClass("Instance Variable") obj.static_method() # 通过实例对象调用 ``` --- #### 3. 使用场景 - **实例方法** 主要用于处理特定于某个实例的数据,适合需要访问或修改实例状态的情况[^3]。 - **类方法** 更适用于处理整个级别的逻辑,比如创建多个不同型的实例(即工厂模式),或者直接操作变量[^1]。 - **静态方法** 是一种独立的功能模块化设计手段,当某段代码仅依赖外部输入而不涉及任何实例的状态时,可以将其定义为静态方法[^4]。 --- #### 4. 权限范围 - **实例方法** **类方法** 都具有一定的权限去更改它们所属的对象(无论是实例还是)的状态。 - **静态方法** 不具备这种能力,因为它完全脱离了实例的作用域[^5]。 --- #### 5. 示例代码 以下是综合展示三种方法使用的例子: ```python class MyClass: class_variable = "Class Variable" def __init__(self, instance_variable): self.instance_variable = instance_variable def instance_method(self): """实例方法""" print(f"Instance Method - Instance Variable: {self.instance_variable}") print(f"Instance Method - Class Variable: {self.class_variable}") @classmethod def class_method(cls): """类方法""" print(f"Class Method - Class Variable: {cls.class_variable}") @staticmethod def static_method(): """静态方法""" print("This is a Static Method") # 测试部分 if __name__ == "__main__": obj = MyClass("Instance Value") # 调用实例方法 obj.instance_method() # 调用类方法 MyClass.class_method() obj.class_method() # 同样有效 # 调用静态方法 MyClass.static_method() obj.static_method() # 同样有效 ``` 运行结果如下: ``` Instance Method - Instance Variable: Instance Value Instance Method - Class Variable: Class Variable Class Method - Class Variable: Class Variable This is a Static Method This is a Static Method ``` --- ### 总结 - 实例方法主要负责操作单个对象的具体行为; - 类方法则更关注整体别层面的操作; - 静态方法则是为了提供额外的帮助函数而存在,不具备对实例的影响能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值