-
类变量 直接在类里面定义
class Student(): sum_student = 0复制代码
-
实例变量 在实例方法里通过self.xxx进行定义和读取
class Student(): # 构造函数 __init__ def __init__(self,name): self.name = name # 实例方法第一个参数不是必须叫self,但是第一个参数代表的是实例本身(this) def print_name(self): print(self.name)复制代码
-
内置函数 dict
__dict__在类中代表类的全部属性的字典,在实例中代表对象的全部属性的字典print(student.__dict__)print(Student.__dict__)复制代码
==当通过 student.name获取变量值的时候,首先会查找实例变量里有没有name属性,如果有则返回,如果没有就会去类变量里找,如果还是没有则会报错==
-
实例方法
- 实例方法通过self.xxx访问实例变量和类变量,具体区分参考上文,不推荐
- 实例方法可以通过self.class.xxx访问类变量
- 实例方法不可以直接访问类变量
class Student(): sum_student = 0 def __init__(self,name): self.name = name def print_name(self): # 实例方法不可以直接访问类变量 # print(sum_student) # 这样可以访问类变量,但是不推荐 print(self.sum_student) # 实例方法访问类变量的正确打开方式 print(self.__class__.sum_student) # 访问实例字典 print(self.__dict__) print(self.name)复制代码
-
类方法 和 静态方法
==类方法和静态方法不能访问实例方法!!!!==
class Student(): sum_student = 0 # 类方法,第一个参数代表类本身 @classmethod def add_and_print_sum(cls): cls.sum_student+=1 print(cls.sum_student) # 静态方法,与类方法不同的是可以不用传第一个参数 @staticmethod def add(x,y): # 访问类变量(所有地方都可以这样访问类变量) print(Student.sum_student) print(x+y)复制代码
-
私有方法和私有变量
在方法或者变量前加__ 构造函数__init__ 可以通过外部访问,是因为init前后都有‘__’, 这是python的内置命名风格,自己命名尽量不要这样做
class Student(): def __init__(self,name,score): self.__name = name self.__score = score def __check_score(self,score): if score>100 or score<0 : print("分数必须在0-100之间") return False return True def marking(self,score): if not self.__check_score(score): return self.__score = score print(self.__name+"的当前分数:"+str(self.__score))复制代码
==注意==
stu = Student('gwf',10)# 这样操作虽然是可以的,但是这不是我们在方法中定义的私有变量__score,而是基于python动态语言的特性,又创建了一个__score的变量stu.__score = -1print(stu.__score)# 真正我们创建的私有变量,在python中是以_Student__score(_类名__私有变量名)进行保存的print(stu.__dict__)# 上面代码打印的结果为{'name': 'gwf', '_Student__score': 10, '__score': -1}# 可以通过stu._Student__score 访问到真正的私有变量,但是不推荐这样做print(stu._Student__score) # 输出 10 复制代码
-
继承
class Human(): def __init__(self,name,age): self.__name = name self.__age = age def do_homework(self): print("这是一个父类方法") def get_name(self): return self.nameclass Student(Human): def __init__(self,name,age,school): # 不建议这样用 # Human.__init__(self,name,age) # 正确用户 super(Student,self).__init__(name,age) self.school = school def do_homework(self): super(Student,self).do_homework() # 不可以这样访问父类变量 # print(self.__name) # print(super(Student,self).__name) print(super(Student,self).get_name()+"正在做作业")复制代码