前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

面向对象

对象是什么:对象就是一个模型

在我们生活中,有许许多多的对象

比如,所有的楼房可以看作一类对象,不管是平房还是高层,都叫楼房

还有面,山西的刀削面,担担面,等等,都需要水煮,有的还可能给你加个鸡蛋,叫做鸡蛋面


对象是我们宏观意义上把一类具有相同属性的事物去总结称呼他,这个总结归纳出来的就是对象

对象是有公有属性,也有一些自己独有的;

比如平房没有电梯,高层没有院子,但是都有门。或者我们的加蛋的面,面条是面这个对象必须有的,但是鸡蛋就不一定了。

类和实例

  • 类:是我们抽象出来的属性集合,是描述
  • 实例:对象是我们用类这个属性集合具体实例生成的,也叫做实例

不管是类还是示例,都会有自己的属性,属性可以是函数也可以是变量

  • 注意:类中的函数经常叫做方法,本质和函数一样

  • 实例属性:定义在方法中的属性(属性可以是方法函数也可以是变量),只作用于当前实例的类
  • 类属性:类属性在整个实例化的对象中共有的,类属性定义在类中且在函数体外,类属性通常不作为实例属性使用

创建一个简单的类

使用class语句来创建一个新类,class之后为类的名称并以冒号结尾

class A:
	"""welcome to use this func""" # 这个地方我们是一个帮助文档
	pass
a = A() # 使用类名加小括号创建实例
help(a)

A是类,a是实例

变量

类中变量

class A:
  	num = 1

直接定义在类中的变量属性,就是类中变量

类中变量可以直接类访问

A.num

也可以被实例直接访问

a,b = A(),A()
a.num
b.num

类修改类中变量

通过类修改类中变量,其余实例拿到的都是被修改后的变量,大家都会变

A.num = 2
a.num
2
b.num
2

实例修改类中变量

某个实例直接修改类中变量,会直接将该变量声明为当前修改实例所独有的,并不会影响他人

a.num = 3
a.num 
3
b.num
2

实例对于不可变变量的修改和赋值,会直接将当前变量私有化

而可变对象,比如列表,对于这样的数据进行修改,会影响全局,因为这是个引用

实例变量

__init__(self)是一种特殊的方法,专门用在类中,称为类的初始化方法,当你创建一个类的实例的时候就会调用这个方法;该方法也支持重写,如果你没没有重写自己的构造函数,系统会有默认的构造函数用来执行。不需要我们显示的调用,这个函数在生成实例的过程中为实例初始化数据

实例创建完我们就希望拥有的变量,可以在__init__方法中进行初始化定义

class A:
  	def __init__(self):
      	self.a = 1
  • 注意__init__方法不允许有返回值

self指针

self指向了抽象出来的一个实例,在类中定义参数时,如果你的这个函数只能是实例出来的实际对象可用,那么你需要加一个self 加了这根指针的意义也在于,如果你同一个类实例出来了多个对象,每个对象都含有一个相同的函数方法,如果你不明确标识这个方法是属于哪个对象的,那么会造成混乱,所以语言发明的人就发明了这个跟self指针,用来指向你当前实例出来的类对象

self并且是python类默认把第一个参数当作这个指向类实例的参数,如果你这里定义成其他字符也是OK
注意,self是约定俗成的一种写法,我们也可以把这个位置的参数命名为别的样子,但是阅读性可能会差

class A:
  	def __init__(self):
        self.l = l
  • 类访问实例属性l
A.l
# AttributeError: type object 'A' has no attribute 'l'

实例变量只能有当前实例访问

  • 实例修改
class A:
		def __init__(self,l):
				self.l = l
l = [1] # 全局可变对象
# ------------
a = A(l)
b = A(l)
a.l[0] = 'a' # 实例进行修改
print(a.l)
['a']
print(b.l)
['a']

通过同一个可变对象创建的实例变量,某个实例进行修改,全局共享修改状态

class A:
	def __init__(self):
		self.l = [1] # 函数内定义的实例可变变量
a = A()
b = A()
a.l[0] = 'a' # 实例进行修改
print(a.l)
print(b.l)

很好理解,本身在init方法里定义变量,就已经不是共享,每个实例都是单独的调用init方法,那么生成的私有化属性互相修改是绝不影响的

猴子补丁

猴子补丁是一种让程序行为在运行时拓展或变更的方法,同时也是一种实例运行期间进行实例变量创建的方式

class A:
  	pass
  
a = A()
a.num = 1
b = A()
b.num # 无法访问

可以在一个已有的实例上,通过=号赋值语句,进行创建一个新的实例变量

  • 注意:实例变量是实例所私有的,如果这个变量不是一个全局传参的可变对象