本文主要是介绍面向对象编程(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
面向对象编程(二)
动态方法与静态方法
# 动态方法(有两种,绑定给对象的方法和绑定给类的方法)
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}
这篇关于面向对象编程(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!