Python面向对象类和变量

前言

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

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

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章: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 # 无法访问

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

  • 注意:实例变量是实例所私有的,如果这个变量不是一个全局传参的可变对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值