# 类与继承

# 选择题

# 1. 题目

定义类如下
class Hello():
    def __init__(self,name)
        self.name=name
    def showInfo(self)
        print(self.name)
下面代码能正常执行的 (   )
A.
h = Hello()
h.showInfo(‘张三’)
B.
h = Hello(‘张三’)
h.showInfo()
C.
h = Hello
h.showInfo()
D.
h = Hello(‘admin’)
showInfo

答案:B

选项 A:错误,__init__方法需要 name 参数,但创建对象时没有传入,且 showInfo 方法不需要参数却传入了 ' 张三 '。

选项 B:正确,创建对象时传入了 name 参数,showInfo 方法正确调用,不需要额外参数。

选项 C:错误,h=Hello 没有创建实例,直接赋值了类对象,无法调用实例方法 showInfo。

选项 D:错误,showInfo 是方法,需要通过对象调用,直接写 showInfo 不会执行任何操作。


# 2. 题目

定义类如下:
class A():
    def a():
        print(“a”)
class B ():
    def b():
        print(“b”)
class C():
    def c():
        print(c)
class D(A,C):
    def d():
        print(“d”)
d = D()
d.a()
d.b()
d.d()
则程序执行的结果是(  )
A.a,b,d
B.执行会报错
C.a,d
D.d,a

答案:B

选项 A:错误,d.b () 无此方法,d.a () 和 d.d () 因缺少 self 参数报错,无法输出该结果。

选项 B:正确,程序存在多重致命错误:a () 和 d () 方法缺少 self 参数,d.b () 调用了不存在的方法,必然触发异常。

选项 C:错误,d.a () 和 d.d () 均会因缺少 self 参数报错,无法正常打印。

选项 D:错误,方法调用均触发报错,无正常输出。


# 3. 题目

关于python类 说法错误的是(  )
A.类的静态属性可以用类名和对象来调用
B.类的实例方法在创建对象前可以调用
C.类的实例方法必须创建对象后才可以调用
D.类的类方法可以用对象和类名来调用

答案:B

选项 A:正确,类的静态属性可以通过类名和对象名访问。

选项 B:错误,实例方法必须通过对象调用,创建对象前无法调用。

选项 C:正确,实例方法必须通过对象调用。

选项 D:正确,类方法可以通过类名和对象名访问。


# 4. 题目

(多选)
定义类如下:
   class  Hello():
            pass
下面说明错误的是(    )
A.该类实例中只包含__dir__(),不包含__hash__()
B.该类实例中包含__hash__()方法
C.该类没有定义任何方法,所以该实例中没有包含任何方法
D.该类实例中包含__dir__()方法

答案:AC

选项 A:错误,类实例会继承 object 类的所有特殊方法,包括_hash_()。

选项 B:正确,类实例继承了 object 类的_hash_() 方法。

选项 C:错误,即使类没有定义任何方法,实例也会继承 object 类的方法。

选项 D:正确,类实例继承了 object 类的_dir_() 方法。


# 判断题

# 1. 题目

定义类时所有实例方法的第一个参数用来表示对象本身,在类的外部通过对象名来调用实例方法时不需要为该参数传值。  (  )

答案:对

解析:在 Python 中,实例方法的第一个参数通常命名为 self,表示对象本身,在调用时 Python 会自动将对象传递给这个参数,不需要显式传值。


# 2. 题目

只可以动态为对象增加数据成员,而不能为对象动态增加成员方法。   (   )

答案:错

解析:在 Python 中,既可以动态为对象增加数据成员,也可以动态为对象增加成员方法,可以通过赋值的方式实现。


# 3. 题目

对于Python类中的私有成员,可以通过“对象名._类名__私有成员名”的方式来访问。 (   )

答案:对

解析:Python 中的私有成员使用双下划线前缀(__)定义,但实际上只是进行了名称修饰,仍然可以通过 “对象名._类名__私有成员名” 的方式访问。


# 4. 题目

如果定义类时没有编写析构函数,Python将提供一个默认的析构函数进行必要的资源清理工作。(    )

答案:对

解析:如果定义类时没有编写析构函数,Python 会提供一个默认的析构函数,用于释放对象占用的资源。


# 5. 题目

Python支持多继承,如果父类中有相同的方法名,而在子类中调用时没有指定父类名,则Python解释器将从左向右按顺序进行搜索。  (   )

答案:对

解析:Python 支持多继承,当调用方法时,解释器会按照 MRO(方法解析顺序)从左向右搜索父类中的方法。


# 6. 题目

Python中没有严格意义上的私有成员。 (   )

答案:对

解析:Python 中的私有成员只是通过名称修饰(name mangling)来实现的,并不是真正的私有,可以通过特殊方式访问,因此没有严格意义上的私有成员。


# 7. 题目

在类定义的外部没有任何办法可以访问对象的私有成员。(   )

答案:错

解析:虽然 Python 使用名称修饰来保护私有成员,但仍然可以通过 “对象名._类名__私有成员名” 的方式在外部访问。


# 8. 题目

定义类时所有实例方法的第一个参数用来表示对象本身,在类的外部通过对象名来调用实例方法时不需要为该参数传值.  (  )

答案:对

解析:实例方法的第一个参数表示对象本身,调用时不需要显式传值。


# 9. 题目

Python中一切内容都可以称为对象。  (   )

答案:对

解析:在 Python 中,一切都是对象,包括数字、字符串、函数、类等。


# 10. 题目

定义类时,在一个方法前面使用@staticmethod进行修饰,则该方法属于静态方法。(    )

答案:对

解析:@staticmethod 装饰器用于定义静态方法,静态方法不需要 self 或 cls 参数,可以通过类名或对象名调用。


# 11. 题目

在设计派生类时,基类的私有成员默认是不会继承的。(   )

答案:对

解析:在 Python 中,基类的私有成员(使用双下划线前缀定义的成员)默认不会被派生类继承,这是名称修饰的结果。


# 填空题

# 1. 题目

在Python中,不论类的名字是什么,构造方法的名字都是______

答案:__init__

解析:在 Python 中,构造方法的固定名称是____init____,用于初始化对象。


# 2. 题目

在Python中定义类时,与特殊方法名__floordiv__()对应的运算符为__________

答案://

解析:在 Python 中,__floordiv__() 方法对应于整数除法运算符 //。


# 3. 题目

定义类时,在一个方法前面使用装饰器_________进行修饰,则该方法属于类方法。

答案:@classmethod

解析:@classmethod 装饰器用于定义类方法,类方法的第一个参数通常是 cls,表示类本身。


# 4. 题目

在Python定义类时,与运算符“**”对应的特殊方法名为_____

答案:_pow_()

解析:在 Python 中,_pow_() 方法对应于幂运算符 **。


# 5. 题目

通过装饰器________可以将类中的方法当作属性成员进行访问。

答案:@property

解析:@property 装饰器用于将方法转换为属性,可以通过属性访问的方式调用方法,而不需要加括号。