一、类的基本概念
1、类的定义
class 类名():
类体
2、类里面可以做哪些事情?
- 定义1个或多个变量
- 定义1个或多个函数:
3、self参数
Python编写类的时候,每个函数(在类中一般叫方法)参数的第一个参数都是self,self只有在类的方法中才会有,独立的函数或方法是不必带有self的,self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数,实际上传 递 给self的值就是一个实例对象,如下图:将实例对象p传递给self
注意:self不是关键字,可以改成任意名字如this,但是为了统一建议使用self
4、 模块之间相互调用:
成员就是类的变量和方法
5、python中的构造函数:__init__
C1.py
1 class Student(): 2 name="" # 类变量要用self来调用 3 age="" 4 def __init__(self,name,age): # 构造函数(方法),当创建对象时会自动调用,构造函数一般用来对实例变量初始化 5 self.name=name # 初始化对象的属性 6 self.age=age 7 def do_homework(self,work): 8 work1=work 9 print(str(self.age)+"岁的"+self.name+"做了"+work1+"作业!")
C2.py
1 from package3.C1 import Student 2 student1=Student("乐乐",11) 3 student1.do_homework("数学") 4 student2=Student("毛毛",12) 5 student2.do_homework("语文")
6、python的类变量和实例变量及实例方法
- 类变量: 和类关联在一起的变量(类属性),根据面向对象思想,在类变量中直接赋值是不合适的,因为类变量最终会分配到每个对象身上,每个对象中该值时不一样的
- 实例变量:和对象关联在一起的变量(对象属性),打印一个实例对象的变量值时首先会在对象中找这个变量,如果没有就会在类里面找这个变量,如果还没有会继续在这个类的父类里面找
- 实例方法:和对象关联在一起,定义在类里面的第一个参数是self的方法,只能由对象来调用
C1.py
1 class Student():
2 sum=0
3 name="" 2# name="nike" 定义类变量name和age,此处直接赋值是不合适的! 3 age=0 4 def __init__(self,name,age): 5 self.name=name # 定义实例变量通过self.name来定义;并进行初始化 6 self.age=age 7 def do_homework(self,work): # 实例方法:哪个对象调用这个方法,self就是哪个对象 8 work1=work 9 print(str(self.age)+"岁的"+self.name+"做了"+work1+"作业!")
C2.py
1 from package3.C1 import Student 2 student1=Student("乐乐",11) 3 student1.do_homework("数学") # 传递给self的对象就是student1 4 student2=Student("毛毛",12) 5 student2.do_homework("语文") 6 print(student1.name) # 打印对象student1的属性name:乐乐 7 print(student2.name) # 打印对象student2的属性name:毛毛 8 print(Student.name) # 打印类 Student 的属性 name:nike 9 print(Student.__dict__) # 打印类的所有的变量:{'__module__': 'package3.C1', 'sum': 0, 'name': 'nike', 'age': '20', '__init__': <function Student.__init__ at 0x00000000028C57B8>, 'do_homework': <function Student.do_homework at 0x00000000028C5840>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
C3.py
1 class Student(): 2 sum=0 3 name="nike" # 定义类变量name和age 4 age="20" 5 def __init__(self,name,age): 6 self.name=name # 定义实例变量通过self.name来定义;并进行初始化 7 self.age=age 8 print(self.name) # 输出:乐乐 9 print(name) # 输出:乐乐 10 11 def do_homework(self,work): 12 work1=work 13 print(str(self.age)+"岁的"+self.name+"做了"+work1+"作业!") 14 15 student1=Student("乐乐",11)
综上C3和截图:在实例方法中使用实例变量必须要使用 self.变量 来调用
打印类变量(C4.py):
- print(self.__class__.sum1) # 打印类变量sum1的值
- print(Student.sum1) # 打印类变量sum1的值
C4.py
1 class Student(): 2 sum1=0 3 name="nike" # 定义类变量name和age 4 age="20" 5 def __init__(self,name1,age): 6 self.name=name1 # 定义实例变量通过self.name来定义;并进行初始化 7 self.age=age 8 print(self.name) # 输出:乐乐 9 print(self.__class__.sum1) # 打印类变量sum1的值 10 print(Student.sum1) # 打印类变量sum1的值 11 12 def do_homework(self,work): 13 work1=work 14 print(str(self.age)+"岁的"+self.name+"做了"+work1+"作业!") 15 16 student1=Student("乐乐",11) 17 print(Student.sum1) 18 print(Student.sum1)
C5.py
1 class Student():
2 sum1=0
3 name="" 4 age="" 5 def __init__(self,name1,age): 6 self.name=name1 # 给对象变量赋值 7 self.age=age 8 self.age+=1 9 self.sum1=10 # 给对象的sum1变量赋值 10 self.__class__.sum1+=1 # 修改类变量的值 11 print("当前班级学生人数为:"+str(self.__class__.sum1)) 12 13 def do_homework(self,work): 14 work1=work 15 print(str(self.age)+"岁的"+self.name+"做了"+work1+"作业!") 16 17 student1=Student("乐乐",11) 18 print(Student.sum1) 19 print(student1.age) 20 print(student1.sum1) 21 student2=Student("毛毛",12) 22 print(Student.sum1) 23 print(student2.age) 24 print(student2.sum1)
---------------------------------------------------------------------------------------------
当前班级学生人数为:1
1
12
10
当前班级学生人数为:2
2
13
10
7、python类的类方法:类方法是将类本身作为对象进行操作的方法,即类方法关联的是类本身,使用装饰器@classmethod修饰的方法,且有一个默认参数cls(也可以用其他变量名代替),
可以用类和对象调用,但是推荐用类来调用,如果要操作一个与对象无关的变量,最后是用类方法来实现,比如C4.py和C5.py中的sum1
引入类方法后C4.py和C5.py可以简写为C6.py,如下:
C6.py
1 class Student(): 2 sum1=0 3 name="" 4 age="" 5 def __init__(self,name1,age): 6 self.name=name1 # 给对象变量赋值 7 self.age=age
8
9 13 @classmethod # 定义类方法 14 def add_sum(cls): # cls代表当前类本身 15 cls.sum1+=1 # 在类方法中修改类变量的值 16 17 student1=Student("乐乐",11) 18 Student.add_sum() # 用类调用类方法,将Student类传递给cls 19 print("当前班级学生人数为:" + str(Student.sum1)) 20 student2=Student("乐乐",11) 21 Student.add_sum() 22 print("当前班级学生人数为:" + str(Student.sum1))
----------------------------------------------------------------------
当前班级学生人数为:1
当前班级学生人数为:2
8、静态方法:用@staticmethod修饰的方法,可以被类和对象调用———不推荐使用
python中类方法,实例方法,静态方法的作用和区别:https://www.cnblogs.com/geogre123/p/10142510.html
C7.py
1 class Student(): 2 sum1=0 3 name="" 4 age="" 5 def __init__(self,name1,age): 6 self.name=name1 # 给对象变量赋值 7 self.age=age 8 9 def do_homework(self): 10 self.do_english_homework() # 实例方法内部调用 11 print(str(self.age)+"岁的"+self.name+"做了"+self.work+"作业!") 12 13 def do_english_homework(self): 14 self.work="英语" 15 16 student1=Student("乐乐",11) 17 student1.do_homework() # 实例方法外部调用
10、修改对象变量值需要用方法修改,提高代码安全性,比如C8.py通过方法修改用户输入的分数
C8.py
1 class Student(): 2 sum1=0 3 name="" 4 age="" 5 def __init__(self,name1,age): 6 self.name=name1 # 给对象变量赋值 7 self.age=age 8 self.score=0 9 10 def dafen(self,score): 11 if score<0: # 在方法中可以对用户输入的值进行校验,提高安全性 12 return "分数不能是负数" 13 self.score=score 14 return self.score 15 16 def do_homework(self): 17 self.do_english_homework() # 实例方法内部调用 18 print(str(self.age)+"岁的"+self.name+"做了"+self.work+"作业!") 19 20 def do_english_homework(self): 21 self.work="英语" 22 23 student1=Student("乐乐",11) 24 result=student1.dafen(100) # 要修改对象变量的值,需要使用方法修改,才能提高安全性 25 print(result)
student1.score=-1
print(student1.score)
如果用户还是要在类的外面修改变量值,如C8.py最后两行代码,怎么办?这就需要补充一下成员的可见性的知识点:
11、成员的可见性:https://www.cnblogs.com/hiwuchong/p/8516277.html
- public:类外面可以调用
- private:属性的名称前面加上两个下划线__,如果一个变量以__开头,就变成了一个私有变量private,在类的外部调用私有成员时会报