浅谈实例方法,类方法,静态方法

话不多说先贴代码:

class Son(object):
    # 类属性
    dad_name = "baba"

    def __init__(self, name):
        self.name = name

    def printf(self):
        print("我是:%s,我的爸爸是:%s" % (self.name, Son.dad_name))

    @classmethod
    def mydad(cls):
        print("我的爸爸是:%s" % cls.dad_name)

    @staticmethod
    def discrite():
        print(Son.dad_name)   # 调用类属性
        Son.mydad()
        print("这个类的说明文档")

a = Son("haungtao")
print(a.dad_name)    # 输出 dada


# 这样就相当于在a这个实例里添加了dad_name这个属性
a.dad_name = "dada1"
print(a.dad_name)   # 输出  dada1 


# 在实例对象里一个属性为__class__属性,该属性为指向创建该实例的类,所以可以通过它来 修改类属性
a.__class__.dad_name = "dada2"
print(Son.dad_name)  # 输出  dada2


Son.discrite()   # 输出:da
                 # 我的爸爸是:da
                 # 这个类的说明文档

       众所周知,类是一个模板,类的作用就是创建实例对象,我们在创建类的时候,系统会给这个类分配空间内存,而由这个类创建出来的实例对象,系统也会为其分配内存,可以这么说,类对象只有一个,而实例对象有多个,当一个方法上部没有任何修饰符,并且该方法的第一个参数为self,(公认为self,也可以为其他,不建议为其他,因为代码阅读性高),该方法就为实例方法,这些方法中有一个特殊方法为__init__方法,此方法为构造方法,在创建每一个实例对象时都会自动调用,而我们讲定义在此方法中的变量称为实例属性,从上面我们可以知道,实例对象在内存中有自己独立的空间,里面有自己的属性,和方法,所以在这里self参数的含义就是此内存空间的引用,所以我们在以后要调用此内存空间里的属性和方法时,需要以self.xxx进行调用.

     我们知道,类在创建的时候系统也会为其分配一块内存,那么我们就可以一开始的时候在定义类的内存里去定义属性和方法,那么我们就称这些定义在类内存里的方法和属性称为类属性,和类方法,当我们需要定义类属性时,只需在类里面,而不再__init__方法和其他方法内部定义即可,而定义类方法时,,需要在此方法上部加上 @classmethod  修饰符 ,以申明此方法为类方法。类属性和类方法是属于类的,不是属于类创建的对象的,当你根据类模板创建类对象时,类属性和类方法不会随着实例的创建而复制,他们只有一份,只属于类,调用类属性和类方法时可以使用 类名.属性名  ,类名.方法名  ,也可以通过实例对象来调用,但是实例对象不能修改类属性,但是可以通过 __class__属性来修改,具体看代码,在此说明下,我们在类方法传递的cls参数,不是非要叫cls,但是规范是命名为cls,在这里cls是指向该类的引用,在类方法里可以通过 cls.xxx访问类属性和类方法.因为没有实例的引用,所以类方法调用不了实例属性和方法

  还有一种方法为静态方法,在申明此方法上加上 @staticmethod 即可申明此方法为静态方法,这时候我们就想问了,有了类方法,为什么还会有静态方法呢,其实静态方法跟类没多少关系,只不过他需要由 类名.方法名 的方式来调用罢了,该方法可以通过

类名.的方式来调用类方法,但他调用不了实例方法和属性 ,

 

猜你喜欢

转载自blog.csdn.net/weixin_44112559/article/details/95327400