个人理解笔记,可能说的不会很详细,也可能有错,欢迎指出。
先上代码,正好使用上一个类的继承代码测试作实例。
class person():
xiaomin = 'Tom'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
self.xiaomin = 'lili'
def tell(self):
print('i am person.')
@staticmethod
def show():
print('i am staticmethod.')
@classmethod
def showMyself(cls):
cls.show()
print(cls.xiaomin)
#父类继承
class student(person):
def __init__(self,name,age,sex,student_id):
#初始化,有两种方式
#person.__init__(self,name,age,sex)
super(student,self).__init__(name,age,sex)
self.s_id = student_id
def tell(self):
#父类函数重构
print('i am student.')
def main():
s = student('limei',25,'woman','20151456931')
s.showMyself()
print(s.xiaomin)
#print(person.xiaomin)
if __name__=='__main__':
main()
先说个人理解吧,对于类的内部,个人认为有两层。
第一层:class下的所有函数或者变量,该层在未进行__init__实例化是可用类名.属性进行访问的,如代码中的xiaomin。
第二层:__init__下的属性,也就是self.属性,该域下的必须进行实例化才能进行实例名.属性进行访问,即__init__中的self.name,self.age等。
静态方法:定义在类函数的内部,使用@staticmethod声明,表示下一个函数为静态方法函数。该函数的特性:参数不需self,无法操作内部self.属性或函数,仅作与类内部变量属性无关无关的通用代码包装整合。
类方法:定义在类函数的内部,使用@classmethod声明,表示下一个函数为静态方法函数。该函数的特性:参数必须带cls,指向该类本身,无法操作内部self.属性,但是可以操作class下的函数及变量,属于第一层。即,访问cls.xiaomin、cls.show()可以,但无法通过cls.name访问定义在__init__内的name属性。并且可以直接通过类名.进行调用而无需实例化。