Python类的深入研究

Python的类虽然也是类,但是不能像C++,Java一样能限制成员的访问权限。下面对Python的类进行深入研究。

  1. 魔术方法的调用优先级

假设有一个类的对象需要for遍历,此时类有魔术方法__getitem__和__iter__。这时候for会调用谁呢?

class A:
	def __init__(self,num):
		self.li = [i for i in range(num)]
	def __getitem__(self,index):
		print('getitem')
		return self.li[index]
	def __iter__(self):
		print('iter')
		return iter(self.li)

a = A(10)
for i in a:
	pass

输出结果
在这里插入图片描述
结论:在for遍历的时候,会优先调用__iter__生成迭代器。如果没有定义,则会调用__getitem__。

repr和str的优先级
我们假设一个类里有__repr__和__str__方法。创建对象以后我们用各种方式调戏它。

class a:
	def __repr__(self):
		return 'repr\\n'
	def __str__(self):
		return 'str\n'

在这里插入图片描述
结论:除非在交互式界面单独打印变量会调用__repr__,或者自己手动调用,其他在正常投入字符串几乎都是调用__str__。
其实,Python里的repr是用来供解释器读取的形式。str是用户阅读的模式。

  1. if+对象 的原理
    在python里常常看到if li:这样的形式,明明它不是逻辑真假,却居然通过了运行。这是为什么?
    假设定义一个对象a,它没有任何的成员
class a:
	pass
A = a()
if A:
	print('True')
else:
	print('False')

在这里插入图片描述
惊不惊喜,什么也没有,竟然也能通过编译。这就怪了。也许在object里存在某种返回真假的函数可以通过编译。接下来,我们对a类进行操作。

class a:
	def __bool__(self):
		return False
A = a()
if A:
	print('True')
else:
	print('False')

结果
在这里插入图片描述
不出所料,原来是将对象转换成了bool类型进行的判断,默认情况下自定义的类都是一直返回为真。

  1. 类真的是“类”吗?
    假设我有2个没半毛钱关系的类,但是他们里面的成员名有的是一样的,更有甚者他们的参数几乎完全一样。如下:
class A:
	def move(self):
		print('A is moving')
	def speak(self,content):
		print(content)
class B:
	def move(self):
		print('B is moving')
	def speak(self):
		print("I'm B")

a = A()
B.move(a)

在这里插入图片描述
WTF?明明是A的对象,用B调用竟然表现了B类的行为。我们再来看看另外一个
在这里插入图片描述
这,,,看起来这两个类真的是儿女都认不出来,我们把a的__class__属性改一下再试试
在这里插入图片描述
这下,a彻底变成了B的对象了。
按照同样的情况在测试一下。我们不难得出:Python的类有些C++里命名空间的味道,而对象仅仅只是个粘着很多属性名和对应属性值的东西,可以乖乖的认亲,也可以强行找个别的爸爸妈妈。对象调用方法时先看的__class__属性,在调用类所在的方法,把这个对象当做第一个参数投进去。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值