9、python之面向对象

一、类的基本概念

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

 

 9、实例方法的内部调用和外部调用
 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,在类的外部调用私有成员时会报

 

 

    

 

 

     

 

     

 

 

    

posted @ 2019-09-10 13:29  YLG001  阅读(297)  评论(0编辑  收藏  举报