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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feikon2/article/details/79128428

Python实例方法、类方法、静态方法区别

类的方法区别

1. 实例方法只能被实例对象调用,静态方法(由@staticmethod装饰的方法)、类方法(由@classmethod装饰的方法),可以被类或类的实例对象调用。

  • 实例方法,第一个参数必须要默认传实例对象,一般习惯用self。
  • 静态方法,参数没有要求。
  • 类方法,第一个参数必须要默认传类,一般习惯用cls。
class Foo(object):
    """类三种方法语法形式"""

    def instance_method(self):
        print("是类{}的实例方法,只能被实例对象调用".format(Foo))

    @staticmethod
    def static_method():
        print("是静态方法")

    @classmethod
    def class_method(cls):
        print("是类方法")


foo = Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
print('----------------')
Foo.static_method()
Foo.class_method()

# output
是类<class '__main__.Foo'>的实例方法,只能被实例对象调用
是静态方法
是类方法
----------------
是静态方法
是类方法

2. 类中静态方法方法调用静态方法的情况

下面的代码,静态方法调用另一个静态方法,如果改用类方法调用静态方法,可以让cls代替类,
让代码看起来精简一些。也防止类名修改了,不用在类定义中修改原来的类名。

# coding:utf-8

class Foo(object):
    X = 1
    Y = 2

    @staticmethod
    def averag(*mixes):
        return sum(mixes) / len(mixes)

    @staticmethod
    def static_method():
        return Foo.averag(Foo.X, Foo.Y)

    @classmethod
    def class_method(cls):
        return cls.averag(cls.X, cls.Y)

foo = Foo()
print(foo.static_method())
print(foo.class_method())

# output:
python
python and django

3. 继承类中的区别 从下面代码可以看出,如果子类继承父类的方法,子类覆盖了父类的静态方法

  • 子类的实例继承了父类的static_method静态方法,调用该方法,还是调用的父类的方法和类属性。
  • 子类的实例继承了父类的class_method类方法,调用该方法,调用的是子类的方法和子类的类属性。
class Father(object):
    X = 1
    Y = 2

    @staticmethod
    def average(*mixes):
        return sum(mixes) / len(mixes)

    @staticmethod
    def static_method():
        return Father.average(Father.X, Father.Y)

    @classmethod
    def class_method(cls):
        return cls.average(cls.X, cls.Y)


class Son(Father):
    X = 3
    Y = 5

    @staticmethod
    def average(*mixes):
        return sum(mixes) / 3


s = Son()
# 子类的实例继承了父类的static_method静态方法,调用该方法,还是调用的父类的方法和类属性。
print(s.static_method())            # (1+2)/2=1.5

# 子类的实例继承了父类的class_method类方法,调用该方法,调用的是子类的方法和子类的类属性。
print(s.class_method())             # (3+5)/3=2.66666
# 1.5
# 2.6666666666666665

参考:https://zhuanlan.zhihu.com/p/21101992

猜你喜欢

转载自blog.csdn.net/feikon2/article/details/79128428