新浪博客

python中的“类”(三)

2023-06-16 12:16阅读:
(九)令人困惑的类属性与实例属性
1)类属性如果被重新赋值是否会影响到类属性的引用?
class TestA:
attr = 1


obj_a = TestA()
TestA.attr = 42
print(obj_a.attr)
42

2)实例属性如果被重新赋值是否会影响到类属性的引用?
class TestA:
attr = 2


obj_a = TestA()
obj_b = TestA()
obj_a.attr = 23
print(obj_b.attr)
2


3)类属性实例属性具有相同的名称,那么“.”后面引用的将会是什么?
class TestA:
attr = 3
def __init__(self):
self.attr = 12


obj_a = TestA()
print(obj_a.attr)
12

也许运行完上面三段代码,你会有一些初步的结论,但是更为直接的解释,全部隐藏在类的特殊属性__dict____dict__是一个类的特殊属性,它是一个字典,用于储存类或者实例的属性即使你不去定义它,它也会存在于每一个类中,是默认隐藏的我们以问题(3)中的代码为背景,在下面添加上这两行代码:
print(TestA().__dict__) #增加的代码
{'attr': 12} #运行结果
print(obj_a.__dict__) #增加的代码
{'attr': 12} #运行结果

其中类TestA和类的实例obj_a各自拥有各自的attr属性,井水不犯河水,是完全独立的但是这样一来又如何解释问题(1)中的情况呢?为什么引用实例属性的方式会和引用类属性的方式是一样的呢?为何在问题3中返回的是12而不是3?请看后面的图: python中的“类”(三)
如图所示,Python中属性的引用机制是自外而内的,当你创建了一个实例之后,准备开始引用属性,这时候编译器会先搜索该实例是否拥有该属性,如果有,则引用;如果没有,将搜索这个实例所属的类是否有这个属性,如果有,则引用,没有那就只报错了
(十)类的扩展理解
现在试着敲下这几行代码:
obj1 = 1
obj2 = 'string!'
obj3 = []
obj4 = {}
print(type(obj1),type(obj2),type(obj3),type(obj4))



Python中任何种类的对象都是类的实例,上面的这些类型被称作内建类型,它们并不需要像我们上面一样实例化。
如果你安装了Beautifulsoup4这个第三方的库,你可以试着这样:
from bs4 import Beau ifulsoup
soup = BeautifulS up
print(type(soup))

然后你可以按住cmd(win系统为ctr)点击Beautifulsoup来查看一个soup对象的完整类定义
(十一)类的实践
真实类背后所承载的理念是OOP(面向对象)的编程理念在大型项目中为了易于管理和维护代码质量,会采取面向对象的方式,这也是软件工程的智慧所在接下来,我们将使用类的概念来编写一个日常的工具库导入到Python的库中,这样一来我们也可以使用import方法导入自己的库了
在使用Python处理数据或者是开发网站时,有时候会使用一些无意义的假数据,比如用户详情页信息
我们来制作这样一个填充用户假数据的小工具,这个小工具的设计思路如下:
父类:FakeUser
功能:
1. 随机姓名
a. 单字名
b. 双字名
c. 无所谓是什么反正有个名字就好了
2. 随机性别

子类:SnsUser功能:
1. 随机数量的跟随者
a. few
b. a lot

开始之前先来处理一下词库,我们使用的随机姓名的词库来自于某输入法的姓名词库解析后的结果,现在分成两个文件,一个是常见姓氏,一个是常见的名使用open函数打开这两个文件将其中的文字添加进列表中我们获取全部的常见姓氏,后面的姓名只获取5000个即可,否则太占内存
ln_path = '/Users/Hou/Desktop/last_name.txt'
fn_path = '/Users/Hou/Desktop/first_name.txt'
fn = []
ln1 = [] #单字名
ln2 = [] #双字名
with open(fn_path,'r') as f:
for line in f.readlines():
fn.append(line.split('')[0])

print(fn)
with open(ln_path,'r') as f:
for line in f.readlines():
if len(line.split('')[0]) == 1:
ln1.append(line.split('')[0])
else:
ln2.append(line.split('')[0])


print(ln1)
print('='*70) #分割线
print(ln2)

我的更多文章

下载客户端阅读体验更佳

APP专享