Python-面向对象-关于继承的题

题1:

class F3(object):

    def f1(self):
        ret = super().f1()  # 跳过本父类,执行下一个父类
        print(ret)
        return 123

class F2(object):

    def f1(self):
        print(‘123‘)

class F1(F3, F2):
    pass

obj = F1()
obj.f1()   # 结果为:123 None

题2:

class F1(object):

    def __init__(self, a1):
        self.a1 = a1

    def f2(self, arg):
        print(self.a1, arg)

class F2(F1):
    def f2(self, arg):
        print(‘666‘)

obj_list = [F1(1), F2(2), F2(3)]
for obj in obj_list:
    obj.f2(‘Shawn‘)  # 类名() 表示创建一个对象 此处F1(1).f2(‘Shawn‘) 便为一个对象
# 打印结果为:1 Shawn, 666, 666

题3:

class F1(object):
    def __init__(self, num):
        self.num = num

    def func(self, request):
        print(self.num, request)

    def run(self):
        self.func(999)  # 这里会先去自己类里面去找

class F2(F1):

    def func(self, request):
        print(666, self.num)

objs = [F1(1), F2(2), F2(3)]
objs[1].run()
objs[2].run()
# 打印结果为:666 2, 666 3

题4:

class UserInfo(object):
    pass

class Department(object):
    pass

class StarkConfig(object):
    def __init__(self, num):
        self.num = num

    def changelist(self, request):
        print(self.num, request)

    def run(self):

        self.changelist(999)

class RoleConfig(StarkConfig):

    def changelist(self, request):
        print(666, self.num)

class AdminSite(object):

    def __init__(self):
        self._registry = {}

    def register(self, k, v):
        self._registry[k] = v(k)  # self._registry[UserInfo]=StarkConfig(UserInfo)
                                   # self._registry[Department]=Roleconfig(Department)
                                   # 类名() 表示创建对象

site = AdminSite()
site.register(UserInfo, StarkConfig)
site.register(Department, RoleConfig)
for k, row in site._registry.items():
    row.run()  # StarkConfig(UserInfo).run()和Roleconfig(Department).run()

# 打印结果为:UserInfo 999,  666 Department         

题5:

class UserInfo(object):
    pass

class Department(object):
    pass

class StarkConfig(object):

    def __init__(self, num):
        self.num = num

    def get_vals(self):
        v = [11, 22, 33]

        extra = self.extra_vals()
        if extra:
            v.extend(extra)
        return v  # extra为空时返回v

    def extra_vals(self):  # 第一次时,pass,返回给extra的为None
        pass

    def run(self):

        return self.get_vals()

class RoleConfig(StarkConfig):

    def extra_vals(self):

        return [99, 88]

class AdminSite(object):

    def __init__(self):
        self._registry = {}

    def register(self, k, v):
        self._registry[k] = v(k)

site = AdminSite()
site.register(UserInfo, StarkConfig)
site.register(Department, RoleConfig)
for k, row in site._registry.items():
    print(row.run())
结果为:[11, 22, 33],  [11, 22, 33, 99, 88]

题6:

class StarkConfig(object):
    def __init__(self, num):
        self.num = num

    def __call__(self, *args, **kwargs):
        print(self.num)

class RoleConfig(StarkConfig):
    def __call__(self, *args, **kwargs):
        print(self.num)

v1 = StarkConfig(1)  # 类名()-->创建对象
v2 = RoleConfig(11)
v1()  # 对象()-->会自动执行__call__
v2()
# 结果为 1,  11

题7:

class StarkConfig(object):
    def __init__(self, num):
        self.num = num

    def run(self):  # self为StarkConfig(1)
        self()  # self为StarkConfig(1)()-->对象()-->自动执行__call__

    def __call__(self, *args, **kwargs):
        print(self.num)  # 1

class RoleConfig(StarkConfig):
    def __call__(self, *args, **kwargs):
        print(345)

v1 = StarkConfig(1)
v2 = RoleConfig(11)
print(v1.run())  # StarkConfig(1).run()  # 无返回值
print(v2.run())  # RoleConfig(11).run()
# 结果为:1,  None,  345, None

题8:

class StarkConfig(object):
    def __init__(self, num):
        self.num = num

    def run(self):
        self()

    def __call__(self, *args, **kwargs):
        print(self.num)

class RoleConfig(StarkConfig):

    def __call__(self, *args, **kwargs):
        print(345)

    def __getitem__(self, item):
        return self.num[item]

v1 = RoleConfig(‘alex‘)
v2 = StarkConfig("wupeiqi")
# print(v1[1])  # <-->RoleConfig(‘alex‘)[1] 对象[key]会自动执行__getitem__(self, item),key赋值给item
# print(v2[2])  # 报错
# 结果:print(v1[1]) l

 总结:

    self在访问方法的顺序:  永远先找自己的. 自己的找不到再找父类的.

原文地址:https://www.cnblogs.com/Hsiyi/p/9937367.html

时间: 2024-10-24 00:15:39

Python-面向对象-关于继承的题的相关文章

Python面向对象特性 - 继承

面向对象有3大特性:继承.多态.封装,本章介绍 Python中的 继承 特性~? 什么是继承 继承是创建类的一种方式,在 Python中支持多继承,即在创建类的时候可以继承一个或者多个父类.在继承关系中,被继承的类通常称为父类(或超类,基类),新建的类则称为子类(或派生类).?继承的优势在于可以有效地重用代码,提高代码的可读性~?继承示例: class Fu_1: # 父类 pass class Fu_2: # 父类 pass class Zi_1(Fu_1): # 单继承 pass class

python面向对象之继承与派生

一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的话,继承顺序有深度和广度2种 示例: class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass

python面向对象之继承/多态/封装

老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(self,name,speed,load,power): self.name = name self.speed = speed self.load = load self.power = power def run(self): print("开动啦.") class Benz(Vehicle

十七、Python面向对象之继承

在面向对象,继承是一个很重要的特性 子类与父类,子类是对父类的一种扩展,在父类的属性和方法上进行一些扩展 示例:没带继承 #定义一个带编号和状态的门的类 class Door(object): def __init__(self,num,status): self.num = num self.status = status def open(self): self.status = 'open' def close(self): self.status = 'close' #定义一个可以锁的门

python面向对象的继承

无话可说,继承主要是一些父类继承,代码是非常具体的 #!/usr/bin/env python #coding:utf-8 class Father(object):#新式类 def __init__(self): self.name='Liu' self.FamilyName='Yan' def Lee(self): print '我是父类函数Lee' def Allen(self): print "我是父类函数Allen" class Son(Father): def __init

Python面向对象之继承

python不支持多态 代码区: 1 class UniversityMember: 2 def __init__(self, name, age): 3 self.name = name; 4 self.age = age; 5 6 # 实例方法 7 def getName(self): 8 return self.name; 9 10 def getAge(self): 11 return self.age; 12 13 # 子类学生类继承父类 14 class Student(Univer

Python 面向对象编程——继承和多态

1.1   继承和多态 1.1.1   继承 当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). >>> class Animal(object): ...    def run(self): ...        print('Animal is running...') #父类 ... >>> class Dog(Ani

python 面向对象四 继承和多态

一.继承 1 class Animal(object): 2 def run(self): 3 print('Animal is running...') 4 5 class Dog(Animal): 6 7 def run(self): 8 print('Dog is running...') 9 10 def eat(self): 11 print('Eating meat...') 12 13 dog = Dog() 14 dog.run() 1 Dog is running... 当子类

Java ,python面向对象的继承及其区别

JAVA JAVA继承基本样式 class Demo extends Object{ Demo(int a){ this(); } Demo(){ super(); } } java默认继承Object 类, 并一定会在构造函数中调用super()方法,对父类进行实例化.注意:this()和super()不能同时出现在同一个构造函数中,但super()必须在其中一个构造函数中出现! Java实例化过程 运行父类的静态代码部分 再运行子类的静态代码部分 执行父类成员代码 执行父类构造函数 -- 父

python -- 面向对象编程(继承、重写)

一.继承 子类可以继承父类的所有公有成员,但不能直接访问父类的私有成员,只能通过父类的公有方法间接访问私有属性或私有方法. 如: class DerviedClassName(BaseClassName1[,BaseClassName2,......]): 语句1 语句2 ....... 语句N 公有属性既可以在类的内部进行访问,也可以在外部程序中使用. 派生类(子类)继承了基类(父类)的行为和属性之后,还可以增加某些特定的行为和属性. 继承分为单继承和多继承 A.单继承 # ---------