ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

面向对象编程(二)

2022-04-07 19:00:23  阅读:121  来源: 互联网

标签:name 继承 self 面向对象编程 print class def


面向对象编程(二)

动态方法与静态方法

# 动态方法(有两种,绑定给对象的方法和绑定给类的方法)
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}

标签:name,继承,self,面向对象编程,print,class,def
来源: https://www.cnblogs.com/cxysbyh/p/16113764.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有