05.python面试之元类

我们基于python中一切皆为对象,字符串、列表、字典、函数是对象,类也是一个对象的概念分析出:我们用class关键字定义的类本身也是一个对象,负责产生该对象的类称之为元类(元类可以简称为类的类),内置的元类为type,type是Python的一个内建元类,用来直接控制生成类,Python中任何class定义的类其实都是type类实例化的对象。

Python中类方法、类实例方法、静态方法有何区别?

  • 类方法: 是类对象的方法,在定义时需要在上方使用 @classmethod 进行装饰,形参为cls,表示类对象,
    类对象和实例对象都可调用
  • 类实例方法: 是类实例化对象的方法,只有实例对象可以调用,形参为self,指代对象本身;
  • 静态方法: 是一个任意函数,在其上方使用 @staticmethod 进行装饰,可以用对象直接调用,静态方法实际上跟该类没有太大关系

遍历一个object的所有属性,并print每一个属性名?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Car:
def __init__(self,name,loss): # loss [价格,油耗,公里数]
self.name = name
self.loss = loss
def getName(self):
return self.name
def getPrice(self):
# 获取汽车价格
return self.loss[0]
def getLoss(self):
# 获取汽车损耗值
return self.loss[1] * self.loss[2]

toyota = Car("丰田", [100000, 6, 500])
# 获取指定属性
print(getattr(toyota, 'name'))
# 获取所有属性方法
print(dir(toyota))
丰田
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'getLoss', 'getName', 'getPrice', 'loss', 'name']

请描述抽象类和接口类的区别和联系

  1. 抽象类: 规定了一系列的方法,并规定了必须由继承类实现的方法。由于有抽象方法的存在,所以抽
    象类不能实例化。可以将抽象类理解为毛坯房,门窗,墙面的样式由你自己来定,所以抽象类与作为基
    类的普通类的区别在于约束性更强
  2. 接口类:与抽象类很相似,表现在接口中定义的方法,必须由引用类实现,但他与抽象类的根本区别
    在于用途:与不同个体间沟通的规则,你要进宿舍需要有钥匙,这个钥匙就是你与宿舍的接口,你的舍
    友也有这个接口,所以他也能进入宿舍,你用手机通话,那么手机就是你与他人交流的接口
  3. 区别和关联:
  • 接口是抽象类的变体,接口中所有的方法都是抽象的,而抽象类中可以有非抽象方法,抽象类是声明
    方法的存在而不去实现它的类
  • 接口可以继承,抽象类不行
  • 接口定义方法,没有实现的代码,而抽象类可以实现部分方法
  • 接口中基本数据类型为static而抽象类不是

Python中如何动态获取和设置对象的属性?

1
2
3
4
if hasattr(Parent, 'x'):
print(getattr(Parent, 'x'))
setattr(Parent, 'x',3)
print(getattr(Parent,'x'))