class Student(object):
#@classmethod修饰的属性可以通过类变量和类实例变量直接调用
#因为在这两种情况下都可以将类变量绑定到@classmethod修饰的方法的第一个参数上
@classmethod
def eat(cls):
print('eating...')
#当类的实例动态添加属性时
class function_1():
print('function_1')
s = Student()
s.function_1 = function_1
print(s.function_1)
#当类变量动态添加属性时(重点)
class function_2():
print('function_2')
Student.function_2 = function_2
print(Student.function_2())
#当执行如下语句会报错,原因在于当类实例调用方法时,该方法必须要有一个参数,因为该实例会绑定到该参数#上,这个参数名一般为self,当然也可以时其他名字.
s2 = Student()
s2.function_2()
#如果时这样就没问题了
class function_3(self):
#当Student对象调用时,self类型为Student
print(type(self))
print('function_3')
Student.function_3 = function_3
#如果是直接调用该函数的话必须传入一个参数(不一定是该类的实例),例如:
Student.function_3('Xixi')
#如果是通过类的实例来调用该函数的话则不用传递第一个参数(默认会传递该实例本身绑定到第一个参数)
#且必须要有一个参数
s3 = Student()
print(s3.function_3)