版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39591494/article/details/82429636
Python之面向对象
一切万物皆为对象!
一、特殊方法
- __init__: 指的是把各种属性绑定到self, self呢 就是代表着实例本身。
- __slots__: 限制实例的动态属性,减少内存消耗,tuple类型
- __str__: 对象的说明文字
- __eq__: 比较对象是不是相等的。
- classmethod 与 staticmethod : classmethod会把类本身作为第一个参数传入进去
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Computer:
def __init__(self, name, mem, cpu):
self._name = name
self.mem = mem
self.cpu = cpu
def play(self, game="qq游戏"):
print(f"玩er{game}")
PC1 = Computer("联想笔记本","16G","8核")
print(PC1.mem)
print(PC1.cpu)
>>>16G
>>>8核
上边定义了一个简单的一个电脑类,电脑有cpu 内存 硬盘等等,在这里我写了name名字 mem内存 cpu
1.1、在PC1对象中添加一个动态属性如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Computer:
def __init__(self, name, mem, cpu):
self._name = name
self.mem = mem
self.cpu = cpu
def play(self, game="qq游戏"):
print(f"玩er{game}")
@property
def name(self):
return self._name
PC1 = Computer("联想笔记本","16G","8核")
print(PC1.mem)
print(PC1.cpu)
PC1.disk = "SSD"
print(PC1.disk)
######输出结果
16G
8核
SSD
在以上的例子中我们可以在PC1实例中添加动态属性。假设有很多个实例,每一个实例都添加动态属性,这时候会在内存开一块新的空间造成资源的浪费,所以我们使用__slots__: 限制实例的动态属性,减少内存消耗,tuple类型 如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Computer:
__slots__ = ("_name","mem","cpu")
def __init__(self, name, mem, cpu):
self._name = name
self.mem = mem
self.cpu = cpu
def play(self, game="qq游戏"):
print(f"玩er{game}")
@property
def name(self):
return self._name
PC1 = Computer("联想笔记本","16G","8核")
print(PC1.mem)
print(PC1.cpu)
PC1.video = "QiCaiHong"
print(PC1.video)
>>> PC1.video = "QiCaiHong"
AttributeError: 'Computer' object has no attribute 'video'
以上实例中,添加了slots 限制了动态属性的添加,AttributeError: 'Computer' object has no attribute 'video'
1.2、使用__str__:对象的说明文字
class Computer:
__slots__ = ("_name","mem","cpu")
def __init__(self, name, mem, cpu):
self._name = name
self.mem = mem
self.cpu = cpu
def play(self, game="qq游戏"):
print(f"玩er{game}")
@property
def name(self):
return self._name
PC1 = Computer("联想笔记本","16G","8核")
print(PC1)
>>><__main__.Computer object at 0x0000000002200288>
实例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Computer:
__slots__ = ("_name","mem","cpu")
def __init__(self, name, mem, cpu):
self._name = name
self.mem = mem
self.cpu = cpu
def play(self, game="qq游戏"):
print(f"玩er{game}")
@property
def name(self):
return self._name
def __str__(self):
return f"{self._name}-{self.mem}-{self.cpu}"
PC1 = Computer("联想笔记本","16G","8核")
print(PC1)
>>>联想笔记本-16G-8核
1.3、__eq__:比较对象是不是相等的。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Computer:
__slots__ = ("_name","mem","cpu")
def __init__(self, name, mem, cpu):
self._name = name
self.mem = mem
self.cpu = cpu
def play(self, game="qq游戏"):
print(f"玩er{game}")
@property
def name(self):
return self._name
def __str__(self):
return f"{self._name}-{self.mem}-{self.cpu}"
def __eq__(self, other):
return self.cpu == other.cpu
PC1 = Computer("联想笔记本","16G","8核")
PC2 = Computer("小米笔记本","100G","8核")
if PC1 == PC2:
print("yes PC1 == PC2")
else:
raise TypeError("PC1 不等于 PC2")
>>>yes PC1 == PC2
不相等如下:
TypeError: PC1 不等于 PC2
classmethod及staticmethod:https://www.cnblogs.com/wangyongsong/p/6750454.html