• 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,在类的外部调用私有成员时会报

        

         

         

     

        

  • 相关阅读:
    我的第一篇博客缓存显示图片
    CSLA.Net 学习 WCF服务端与客户端配置
    CSLA.Net 学习 刚接触
    [转] DevExpress 第三方控件汉化的全部代码和使用方法
    java版飞信协议实现
    [转]C#反射技术之一读取和设置类的属性
    NHibernate帮助类
    Oracle 11g 精简客户端打包 201206更新
    Mygeneration模板(NHibernate)生成,根据kdup的修改而来
    [转]TransactionScope应用
  • 原文地址:https://www.cnblogs.com/yhms/p/11490389.html
Copyright © 2020-2023  润新知