5-1 面向对象基础及Python 类常考问题

Posted WinvenChang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5-1 面向对象基础及Python 类常考问题相关的知识,希望对你有一定的参考价值。

一、什么是面向对象编程?

Object Oriented Programming(OOP)
1.把对象作为基本单元,把对象抽象成类(Class),包含成员和方法
2.数据封装、继承、多态
3.Python中使用类来实现。过程式编程(函数),OOP(类)

二、python中如何创建类?
def Person(object):   # py3 直接 class Person
	def __init__(self, name, age):
		self.name = name
		self.age = age

	def print_name(self):
		print('my name is {}'.format(self.name))
三、组合与继承

优先使用组合而非继承
1.组合是使用其他的类实例作为自己的一个属性(Has-a关系)
2.子类继承父类的属性和方法(Is a 关系)
3.优先使用组合保持代码简单

之前实现stack/queue就使用到了组合

四、类变量和实例变量的区别

区分类变量和实例变量
1.类变量是由所有实例共享
2.实例变量由实例变量单独享有,不同实例之间不影响
3.当我们需要在一个类的不同实例之间共享变量的时候使用类变量

五、classmethod/staticmethod区别

1.都可以通过 class.method()的方式使用
2.classmethod第一个参数是cls,可以引用类变量
3.staticmethod使用起来和普通函数一样,只不过放在类里去组织
4.classmethod是为了使用类变量,staticmethod是代码组织的需要,完全可以放到类之外

六、什么是元类?使用场景

元类(Meta Class)是创建类的类
1.元类允许我们控制类的生成 ,比如修改类的属性等
2.使用 type来定义元类
3.元类最常见的一个使用场景就是ORM框架

class Base:
	pass

class Child(Base):
	pass

# 等价定义, 注意 Base 后要加上逗号 ,否则就不是 tuple 了
SameChild = type('Child', (Base,), {})


# 加上方法
class ChildWithMethod(Base):
	bar = True

	def hello(self):
		print('hello')
	
def hello(self):
	print('hello')

# 等价定义
ChildWithMethod = type(
	'ChidlWithMethod', (Base, ), {'bar': True, 'hello': hello}  # 这里的 hello 是外面的定义函数
)


# 元类继承自 type
class LowercaseMeta(type):
	""" 修改类的属性名称为小定的元类 """
	def __new__(mcs, name, bases, attrs):
		lower_attrs = {}
		for k, v in attrs.items():
			if not k.startswith('__'):   # 排除 magic method
				lower_attrs[k.lower()] = v
			else:
				lower_attrs[k] = v
		return type.__new__(mcs, name, bases, lower_attrs)

class LowercaseClass(metaclass=LowercaseMeta):  # py3
	BAR = True

	def HELLO(self):
		print('hello')

print(dir(LowercaseClass))   # 你会发现 "BAR" 和 “HELLO"都变成了小写

# 用一个类的实例调用 hello 方法,我们修改了类定义时候的属性名
LowercaseClass().hello()

说明:
__new__生成实例,__init__初始化

七、总结

面向对象与 python类常考题
1.什么是面向对象编程,python如何使用类
2.组合 vs 继承;类变量 vs 实例变量;classmethod vs staticmethod
3.元类的创建和使用

以上是关于5-1 面向对象基础及Python 类常考问题的主要内容,如果未能解决你的问题,请参考以下文章

5-2 装饰器面试常考问题

函数式编程和面向对象编程

Python基础题

Python面试题(基础部分)

Python之路第七篇--Python基础之面向对象及相关

Python基础-第六天-面向对象编程