面向对象编程(二)

一、动静态方法

什么是动静态?
 动态就是绑定给对象的方法直接在类体代码中编写即可,对象调用会自动将对象当做第一个参数传入,类调用有几个形参就传几个实参;静态方法就是普通的函数
代码实现:
class Person:
    type = '动物'

    def Monkey(self):  # 给对象绑定数据,self用于接收对象
        print('一只猴子', self)

    @classmethod  # 给类绑定方法,cls用于接收类
    def duck(cls):
        print('一只小黄鸭', cls)

    @staticmethod  # 被@staticmethod修饰的方法,就是静态方法
    def chicken(a, b):  # 按照普通函数传参方式
        print('一只火鸡')


stu1 = Person()
Person.duck()  # 类调用会自动将类当做第一个参数传入
stu1.duck()  # 对象调用会自动将产生该对象的类当做第一个参数传入

Person.chicken(1, 2)

image

二、面向对象三大特征之继承

1.面向对象三大特征
  继承   封装   多态
2.继承的含义
  继承就是让类继承了另外一个类转变为父子关系,子类可以直接访问父类的静态方法和属性,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。
3.继承的目的
   可以减少代码编写
    减少代码的冗余
    提高重复使用率
4.继承的操作
   定义:
      class 类名(父类名):
            pass
    定义类的时候类名后面加客户
    括号内填写你需要继承的类名
    括号内可以填写多个父类,用逗号隔开
# 定义父类
class Father():
    name = 'daddy'
# 定义子类,继承父类
class Son(Father):
    pass

# 3. 创建子类对象,并调用其继承到的属性和方法
obj = Son()
print(obj.name)

三、继承的本质

1.对象:数据和功能的结合体
2.类:多个对象相同的数据和功能的结合体
3.父类:多个类相同数据和功能的结合体
4.抽象:把多个类公共的数据或功能那出来形成一个基类
5.继承:从上往下获取每个基类中的资源
类与父类的本质都是为了节省代码

四、数据和方法的查找顺序

1.不继承父类的情况下名字的查找顺序

class Son():
    name = 'one'
obj = Son()
print(obj.name)   # one
对象自身  ---->>类

2.单继承情况下的名字查找顺序

class Father():
    name = 'father'
class Son():
    # name = 'one'
obj = Son()
print(obj.name)   # father
对象自身 ----> 类 ---->继承的父类

3.多继承的情况下名字查找顺序

class D():
    name = 'D'
class C():
    name = 'C'
class B():
    name = 'B'

class A(C):
    # name = 'A'
    pass
obj = A()
print(obj.name)

顺序:A->B  C->D
非菱形继承深度优先 每个分支走到底,再切换

图片名称

class E():
    name = 'E'
class D(E):
    name = 'D'
class C(D):
    name = 'C'
class B(E):
    name = 'B'

class A(B):
    # name = 'A'
    pass
obj = A()
print(obj.name)

顺序:A->B  C->D->E
菱形继承深度优先 (前面几个分支都不会走最后一个类 最后一个分支才会走)
当实在搞不清的时候可以用类点mro()方法查看该类产生的对象名字的查找顺序

图片名称

总结:
   菱形继承
    	广度优先(最后才会找闭环的定点)
  	非菱形继承
    	深度优先(从左往右每条道走完为止)
 	ps:mro()方法可以直接获取名字的查找顺序

五、经典类与新式类

经典类:不继承object或者其子类的类
新式类:继承object或者其子类的类
1.Python2解释器中有经典和新式类
2.Python3解释器中只有新式类,所有的类默认都会继承object

六、派生方法

子类基于父类某个方法做了扩展

class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


class Student(Person):
    def __init__(self, name, age, gender, sid):
        super().__init__(name, age, gender)  # 子类调用父类的方法
        self.sid = sid


class Teacher(Person):
    def __init__(self, name, age, gender, level):
        super().__init__(name, age, gender)
        self.level = level


stu1 = Student('jason', 18, 'male', 666)
print(stu1.__dict__)
tea1 = Teacher('tony', 28, 'female', 99)
print(tea1.__dict__)



class MyList(list):
    def append(self, values):
        if values == 'jason':
            print('jason不能尾部追加')
            return
        super().append(values)

obj = MyList()
print(obj, type(obj))
obj.append(111)
obj.append(222)
obj.append(333)
obj.append('jason')
print(obj)

原文地址:http://www.cnblogs.com/zx0524/p/16854757.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性