话不多说先贴代码:
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 即可申明此方法为静态方法,这时候我们就想问了,有了类方法,为什么还会有静态方法呢,其实静态方法跟类没多少关系,只不过他需要由 类名.方法名 的方式来调用罢了,该方法可以通过
类名.的方式来调用类方法,但他调用不了实例方法和属性 ,