1.根据以下程序,下列选项中,说法正确的是:(D)
class Vector: __slots__='x','y' def __init__(self): pass class Vector3d(Vector): __slots__='x','z' def __init__(self): pass vector = Vector() vector3d = Vector3d()
A.若子类没有定义__slots__属性,则子类可以继承父类的__slots__属性
B.Vector类的实例对象vector会自动获得实例属性x和y
C.Vector3d类的实例对象vector3d最多只能允许属性x和z
D.Vector3d类的实例对象vector3d最多只能允许属性x、y和z
解析:
__slots__属性用来限制实例对象的属性,实例对象的实例属性最多只能在__slots__属性值的范围内。如果子类没有定义__slots__属性,则不会继承父类的__slots__属性,如果子类定义了__slots__属性,则子类对象允许的实例属性包括子类的__slots__加上父类的__slots_。Python中凡是 "__" 开头的变量,都是私有变量,私有变量继承需要定义同名变量,因此A错误;__slots__是python类中的特殊变量,用于限制实例对象的属性,如__slots__='x','y',那么实例对象的属性就只能从这些里面找,因此它起的是限制效果而非自动获得,因此B错误;定义同名变量后子类继承父类的__slots__,从而支持xyz,因此C错误;故D选项正确。
2.运行下列四个选项的程序,不会抛出异常的是:(D)
A.
class Rect: def __init__(self,width,height): self.width = width self.height = height @property def area(self): return self.height* self.width rect = Rect(10,20) rect.area()
B.
a = 0 def fun(): a += 1 print(a) fun()
C.
class Animal: def __init__(self,color="白色"): Animal.color = color def get_color(self): print("Animal的颜色为",Animal.color) class Cat(Animal): def __init__(self): pass cat = Cat() cat.get_color()
D.
class Cat: def __init__(self,color="白色"): self.__color = color cat = Cat("绿色") print(cat._Cat__color)
解析:
A选项,使用property会将方法转为属性,因此rect.area()应该改为rect.area。B选项,当给作用域中的一个变量赋值时,Python 会自动的把它当做是当前作用域的局部变量,从而会隐藏外部作用域中的同名变量,因此a += 1会报错。C选项,子类若有定义__init__()函数时,将不会自动继承父类的构造函数,因此在调用父类的get_color()函数时,会出现Animal找不到属性color,修改时只需在子类的__init__()函数中添加语句:super().__init__()。D选项,尽管color属性为私有属性,但是在类外部使用时,仍可以通过实例名._类名__来访问。
3.根据以下代码,下列选项中,说法正确的是:(C)
class Rectangle: __count = 0 def __init__(self,width,height): Rectangle.__count += 1 self.__width = width self.__height = height @property def area(self): return self.__height * self.__width rectangle = Rectangle(200,100)
A.创建实例对象rectangle后,可在类外使用rectangle.area()来访问area属性
B.area属性为对象的非私有属性,可以访问和修改
C.变量__count的作用是为了统计创建对象的个数
D.因为__width和__height为私有变量,所以在类外不可能访问__width和__height属性
解析:
使用@property将方法转为属性,该属性为只读属性,只可访问但是不可以修改,使用对象.方法名来访问该属性,但是方法不能再加小括号,故AB选项说法均错误;变量__count是类的私有变量,由于每次创建对象时,其值自增1,所以可以用来统计创建对象的个数,C正确;虽然__height和__width为私有变量,不能在类外直接使用对象名.属性名来访问,但是,仍可以使用rectangle._Rectangle__width和rectangle._Rectangle__height来强制访问,故D错误。
4.已知
print_func.py的代码如下:
print('Hello World!') print('__name__value: ', __name__) def main(): print('This message is from main function') if __name__ =='__main__': main() print_module.py的代码如下: import print_func print("Done!") 运行print_module.py程序,结果是:(A)
A.
Hello World! __name__ value: print_func Done!
B.
Hello World! __name__ value: print_module Done!
C.
Hello World! __name__ value: __main__ Done!
D.
Hello World! __name__ value: Done!
解析:
直接执行print_func.py模块,__name__="__main__'',如以导入模块的形式执行print_func文件,则__name__的值为该文件名print_func。
5.为了以下程序能够正常运行,横线处可以填入的语句是:(C)
class Animal: def __init__(self,color): self.__color = color @property def color(self): return self.__color @_____________________ def color(self,color): self.__color = color animal = Animal('red') print(animal.color) animal.color = 'white' print(animal.color)
A.property
B.setter
C.color.setter
D.setter.color
解析:
程序创建了一个animal对象,然后访问和修改对象的私有属性__color,@property装饰器,相当于一个get方法,用于获取私有属性值,因此需要补充的是setter方法。python对于setter装饰器的语法是:@方法名.setter,因此答案为C选项。property装饰器可以安全的改变函数的属性,利用装饰器的特性,就可以生成装饰器函数下方一样命名的变量,改变该函数就可以采用该函数名.setter;除此之外还有getter,和delter;注意getter的使用一定要在setter和delter之前。