其他分享
首页 > 其他分享> > 动静态方法与继承

动静态方法与继承

作者:互联网

对象独有的功能

class Student:
    school = '霍格沃兹魔法学院'

    def __init__(self, name):
        self.name = name  # 对象的独有的数据

    def est(self):  # 对象调用时会将对象当做第一个参数传入
        print('%s正在看魁地奇比赛' % self.name)


res1 = Student('harry')
res1.est()
# harry正在看魁地奇比赛
res2 = Student('hermione')
res2.est()
# hermione正在看魁地奇比赛
'''
对对象独有的方法,无法实现,在全局中不是独有的,在类中则是公共的
python解释器有一个特性,定义在类中的函数是绑定给对象的,相当于对象的独有方法
'''

动静态方法

'''
在类体代码中编程的函数
1.要绑定给对象的方法,就直接在类体代码中编程,对象调用时会自动将对象当第一个参数传入,类调用时有几个形参就传几个实参
2.静态方法就只是普通的函数
'''
class Student:
    school = '霍格沃兹魔法学院'

    def __init__(self):  # self用于接收对象
        print('开始喽', self)

    @classmethod  # 绑定给类的方法
    def est(cls):  # cls用于接收对象
        print('正在看魁地奇比赛', cls)

    @staticmethod  # 静态方法
    def run(a, b):  # 调用时必须按照函数的传参要求
        print('溜了溜了')


res1 = Student()
# 开始喽 <__main__.Student object at 0x000002399E2EF190>
Student.est()
# 正在看魁地奇比赛 <class '__main__.Student'>
res1.est()
# 正在看魁地奇比赛 <class '__main__.Student'>
Student.run(1, 2)
# 溜了溜了
res1.run(1, 2)
# 溜了溜了
img

面向对象三特性之继承

'面向对象三大特性分别是:继承、封装、多态'
1.继承的含义
在编程的数据里继承是用来描述类与类之间数据的关系,如a继承了b,则a拥有了b的所有数据和功能
2.继承的目的
在编程的数据里继承可以帮我们节省代码的编写,且一个类可以继承多个类
3.继承的操作
class 子类名(父类名):
    pass
'''
1.定义类名时在类名后面加括号,括号内填写需要继承的类名,如果要继承多个类名,可以用逗号隔开
2.类的称呼
被继承的类称为:父类或基类或超类
继承的类称为:子类或派生类
'''

继承的本质

1.抽象:将多个类共同的数据或功能抽取出来形参一个父类
2.继承:一层一层的获取父类里的资源
'''
对象:数据和功能的结合体
类:多个对象相同的数据和功能的结合体
父类:多个类相同的数据和功能的结合体
'''

名字的查找顺序

1.不继承的情况下查找名字的顺序
class Student:
    school = '霍格沃兹魔法学院'

    def est(self):  # cls用于接收对象
        print('正在看魁地奇比赛')


res = Student()
print(res.school)
# 霍格沃兹魔法学院
res.school = '德姆斯特朗魔法学院'  # 对象点名字是在自身的名称空间中产生了新的school
print(res.school)
# 德姆斯特朗魔法学院
print(Student.school)
# 霍格沃兹魔法学院
'先在对象自身查找,若没有,再去产生该对象的类中查找'

2.单继承情况下名字的查找顺序
class A:
    name = 'from A'
	 pass

class B(A):
    name = 'from B'
	 pass

class C(B):
    name = 'from C'
	 pass

odj = C()
# odj.name = 'from odj'
print(odj.name)
# 查找顺序:from odj>>>from C>>>from B>>>from A
'先在对象自身查找,若没有,再去产生该对象的类中查找,若还是没有,则去类的父类中查找...'

3.多继承的情况下名字的查找顺序
3.1非菱形继承
class A:
    name = 'from A'
    pass

class B:
    name = 'from B'
    pass

class C(B):
    name = 'from C'
    pass

class D(A):
    name = 'from D'
    pass

class E(D, C):
    name = 'from E'
    pass

odj = E()
# odj.name = 'from odj'
print(odj.name)
# 查找顺序:from odj>>>from E>>>from D>>>from A>>>from C>>>from B
'非菱形继承是深度优先,它是将类的每个分支走到底,在换下一分支'

3.2菱形继承
class F:
    name = 'from F'
    pass

class A(F):
    name = 'from A'
    pass

class B(F):
    name = 'from B'
    pass

class C(B):
    name = 'from C'
    pass

class D(A):
    name = 'from D'
    pass

class E(D, C):
    name = 'from E'
    pass

odj = E()
# odj.name = 'from odj'
print(odj.name)
# 查找顺序:from odj>>>from E>>>from D>>>from A>>>from C>>>from B>>>from F
'菱形继承是广度优先,它是走完全部分支在走最后一个父类'
img

经典类与新式类

经典类:不继承object或其子类的类
新式类:继承了object或其子类的类
'''
在python3.X中所有的类都是默认继承object,所以python3.X里只有新式类
在python2.X中有经典类和新式类

为了兼容python2.X,在定义的时候,如果没有要继承的父类,可以写成:
class 子类名(object):
    pass

写代码时对object无需关心,知道它是什么就可以了
'''

派生方法

'''
调用父类可以获得父类的功能和数据,但子类要扩展新的数据和功能,就需要用到派生方法
'''

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


class Student(School):
    def __init__(self, name, age, location):
        # School.__init__(self, name, age)  # 子类调用父类的方法
        super().__init__(name, age)  # super是专门用与子类调用父类的方法
        self.location = location  # 调用后在加上这个身份特有的数据


class Teacher(School):
    def __init__(self, name, age, course):
        # School.__init__(self, name, age)
        super().__init__(name, age)
        self.course = course


res1 = Student('harry', 18, '找球手')
print(res1.name)  # harry
print(res1.age)  # 18
print(res1.location)  # 找球手
res2 = Teacher('snape', 38, '魔药学')
print(res2.name)  # snape
print(res2.age)  # 38
print(res2.course)  # 魔药学

'派生方法可以让我们在用父类时通过super()增加功能'
class MYClasss(list):
    def append(self, age):
        if age == 'harry':
            print('harry不能加入列表')  # harry不能加入列表
            return
        super().append(age)


obj = MYClasss()
obj.append(110)
obj.append(120)
obj.append('harry')
obj.append(119)
print(obj)  # [110, 120, 119]

标签:静态方法,name,继承,self,odj,pass,print,class
来源: https://www.cnblogs.com/riuqi/p/16526109.html