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 类常考问题的主要内容,如果未能解决你的问题,请参考以下文章