Java教程

面向对象编程(二)

本文主要是介绍面向对象编程(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

面向对象编程(二)

动态方法与静态方法

# 动态方法(有两种,绑定给对象的方法和绑定给类的方法)
1.绑定给对象的方法
# # 1.绑定给对象的方法
# class Student:
#     def chiose_class(self):
#         print(self)
# Student.chiose_class(123)  # 类调用函数有几个参数就传几个参数
# obj1 = Student()
# obj1.chiose_class()  # 对象调用会将对象本身当做第一个参数传入
# >>>123
# >>><__main__.Student object at 0x014EC4F0>

# # 2.绑定给类的方法
# class Student:
#     @classmethod
#     def chiose_class(cls):
#         print(cls)
# Student.chiose_class()  # 类调用函数时会将类本身当做第一个参数传入
# obj1 = Student()
# obj1.chiose_class()  # 对象调用是会将产生对象的类当做第一个参数传入

# # 静态方法
# class Student:
#     @staticmethod
#     def chiose_class(a):
#         print(a)
# Student.chiose_class(123)
# obj1 = Student()
# obj1.chiose_class(123)
# 无论类调用还是对象调用都要传指定数量的参数
# >>>123
# >>>123

面向对象三大特征之一:继承

"""
面向对象有三大特性 其中最重要的就是继承!!!
	继承、封装、多态
"""
# 继承的含义
	现实生活中继承是用来描述人与人之间资源的从属关系
    eg:继承朕的江山 朕的所有资源你又可以使用
    面向对象的继承是用来描述类与类之间资源(数据,功能...)的从属关系
    eg:类A继承了类B 那么A可以使用B的所有资源(数据,功能...)
# 继承的目的
	'''继承的目的就是合理偷懒!!!'''
    继承可以减少代码冗余,提高开发效率
    python支持直接多继承
# 继承的基本使用
# class A:
#     name_A = 'name from A'
#     def num_A(self):
#         print('A')
# 
# class B:
#     name_B = 'name from B'
#     def num_B(self):
#         print('B')
# 
# class C(A,B):  # 定义类C,继承类A,类B
#     name_C = 'name from C'
#     def num_C(self):
#         print('C')
# 
# obj1 = C()
# print(obj1.name_A)  # C实例化的对象可以直接调用A,B类中的数据和方法
# obj1.num_B()
# >>>name from A
# >>>B
'''
被继承的类称为:父类或基类  A,B
继承别人的类称为:子类或派生类  C
'''

继承的本质

抽象:由下往上抽取相同特征
继承:由上往下直接白嫖资源
"""
在面向对象编程中 其实类和父类的主要功能都是用来减少代码冗余的

对象:数据与功能的结合体
类:多个对象相同数据和功能的结合体
父类:多个类相同数据和功能的结合体
"""  
class Person:  # 人类,存放人共有的属性
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

class Teacher(Person):  # 老师类,继承人类,这里写老师角色独有的属性
    teacher_id = '123456789'  # 老师特有数据,教师号
    def teacher(self):  # 老师特有的教书功能
        print(self)

class Student(Person):  # 学生类,继承人类,这里写学生角色独有的属性
    study_id = '987654321'  # 学生特有数据,学生号
    def study(self):  # 学生特有的学习功能
        print(self)

名字的查找顺序

# 不继承的情况下
	先从对象自己的名称空间找,没有再去类的名称空间找
    对象>>>类
    '''注意设置值的情况下是在自身的名称空间中添加或者修改数据'''

# 单继承的情况下
	先从自己的名称空间找,没有去对象生成类的名称空间,再没有去父类名称空间,并且如果父类有父类一直往复找下去!!!
    对象>>>类>>>父类>>>父类的父类
    '''根据血缘关系,由近及远'''
    经典案例
  	class A:
      def f1(self):
          print('from A.f1')
      def f2(self):
          print('from A.f2')
          self.f1()  '''以后看到self点东西 一定要问自己self是谁'''
    class MyClass(A):
       def f1(self):
            print('from MyClass.f1')
    obj = MyClass()
    obj.f2()
    # 执行的方法分别是A里面的f2和MyClass里面的f1
    
# 多继承的情况下(了解)
	"""
	在python2中存在经典类与新式类
	在python3中只有新式类
		区分的关键在于是否继承了一个默认的object类
			新式类:直接或者间接继承了object或者其子类的类
			经典类:不继承任何的类
	"""
  强度:研究菱形和非菱形问题object不参与图形构建
  非菱形继承的情况下
  	父类中名字的查找顺序就是按照继承时从左往右依次查找
   	如果多个父类还有分类 那么遵循"深度优先"
  菱形继承的情况下
  	父类中名字的查找顺序就是按照继承时从左往右依次查找
   	如果多个父类还有分类 那么遵循"广度优先"
#############################################
'''名字的查找顺序永远都是 先从当前对象自身开始查找'''
#############################################

派生类

派生类关键字'super'
eg:
    class Person:  # 人类,存放人共有的属性
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender

    class Teacher(Person):  # 老师类,继承人类,这里写老师角色独有的属性
        def __init__(self,name,age,gender,teacher_id):
            # super(Teacher,self).__init__(name,age,gender)  # 子类调用父类的方法 完整语法
            super().__init__(name,age,gender)  # 子类调用父类的方法 精简语法
            self.teacher_id = teacher_id  # 老师特有数据,教师号
            def teacher(self):  # 老师特有的教书功能
                print(self)

    class Student(Person):  # 学生类,继承人类,这里写学生角色独有的属性
        def __init__(self,name,age,gender,study_id):
            super().__init__(name,age,gender)
            self.study_id = study_id  # 学生特有数据,学生号
            def study(self):  # 学生特有的学习功能
                print(self)
"""
如果自己写的子类需要使用父类的方法 并且还需要基于该方法做扩展
这样的子类我们称之为派生类(本质还是子类)      
    那么可以使用super关键字来实现
"""
obj1 = Teacher('petter',20,'male','123456789')
print(obj1.__dict__)
运行结果:
    {'name': 'petter', 'age': 20, 'gender': 'male', 'teacher_id': '123456789'}

派生功能前瞻

class MyDictClass(dict):
    def update(self,d):
        super(MyDictClass, self).update(d)

obj2 = MyDictClass()
obj2.update({'name':'petter','age':18})
print(obj2)

运行结果:
    {'name': 'petter', 'age': 18}

这篇关于面向对象编程(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!