目录
1. GIL(全局解释器锁)
2. 深拷贝和浅拷贝
3. 私有化
4. import 导入模块
4.1方法:
4.2 拓展: 调用函数时根据搜索路径列表的先后顺序调用的。
4.3 多模块开发import导入注意点:
5. 封装,继承,多态——面对对象编程
6. 多继承与__mro__ 方法
7. *args()-元组参数,**kwarg-字典参数
8. 类与属性
8.1 类属性;类方法
8.2 类方法;实例方法
8.3 静态方法
9. @property 属性
9.1 基础
9.2 装饰器使用方法
9.3 使用类属性方式实现
10. 魔法属性
10.1 __doc__
10.2 __module__和__class__
10.3 __init__
10.4 __del__
10.5 __call__
10.6 __dic__
10.7 __str__
1. GIL(全局解释器锁)
- 是什么?
- 由于python解释器是由c语言编写,遗留问题:在多线程中同一时间只执行一个线程。
- 只对python中的线程有影响。
- 对于多线程影响。
- 多线程在同一时间只能执行一个线程。
- 适用于解决 I/O (收发)的问题。(有时间等待)
- 不适用与密集计算型的问题,此问题适用于多进程。
- 解决方法:
- 换解释器,适用java编写的解释器没有此影响。
- 适用其他语言解析。
2. 深拷贝和浅拷贝
- 浅拷贝:只拷贝引用,不拷贝原数据。—— copy.copy()
- 深拷贝:拷贝引用的同时也会拷贝元数据。—— copy.deepcopy()
注意:
- 元组中只有不可变类型数据,深拷贝与浅拷贝都不会变,(原因:元组是不可变的);若元组类中元素是可变类型的,浅拷贝不会变,深拷贝会变化。
- 切片是浅拷贝。
- 参数的传递实际传递的是引用。
应用: 深拷贝使用拷贝内容时不会影响原数据;浅拷贝使用拷贝数据时会影响原数据。
3. 私有化
__xx : 在类中是私有属性方法,子类不能继承。__xx__ : 魔法方法,内置方法。子类可以继承__xx : 在导入模块时禁止导入。
4. import 导入模块
4.1方法:
from xx import yy import xx from xx import * import xx, zzz from xx import yy, mm import xx as yy :起别名,避免变量重复
4.2 拓展: 调用函数时根据搜索路径列表的先后顺序调用的。
? 查看搜索路径:
import sys
sys.path()
在当前函数下可以查看函数搜索路径,函数会根据搜索列表的先后性依次查找需要调用函数模块的路径。
sys.path.append(路径) # 最后增加
sys.path.inser(0, 路径) # 插入想要的路径
- 模块导入后,不可修改,如果要修改后运行要使用方法:
from xxx import reload
4.3 多模块开发import导入注意点:
import yy from xx import yy
? 两种方法导入模块的不同点: 在使用xx函数模块中yy函数,若yy = True (进行了赋值。)
? 第一种导入方式,指向yy模块中函数xx这个函数。
? 第二种导入方式,指向True这个值。
? 结果: 在主函数修改值时,1会成功,2会失败。
5. 封装,继承,多态——面对对象编程
- 封装:时复杂函数更加简洁。
- 继承:提高代码重用。
- 多态:子类编写父类的同名方法,会优先调用子类的方法。
6. 多继承与__mro__ 方法
拓展:
- 重写:调用同名称方法,之后调用的会覆盖之前调用的。
- 重载:调用同类方法,通过传入参数类型的不同,调用对用的同名方法。(python中重载很弱)
__mro__方法:
- 作用:查看当前类继承调用顺序,返回值是一个元组。
- 使用方式:
类名.__mro__
继承父类的写法:
父类名.__init__(self, 参数) super.__init__(参数) super.(父类名.self).__init__(参数)
? 说明:
? 1.第一种继承父类写法,好处在于简介,缺点是:当d类继承b类,c类,b,c 类继承a类,d类会重复继承a。
2. 第二种会按照类的继承顺序继承不会导致重复调用。
2. 第三种,可以指定调用的父类名,根据继承顺序调用。
7. *args()-元组参数,**kwarg-字典参数
* 的目的在于告诉服务器特殊对待。- 当B函数在A函数中运行,要将
args 与kwarg 数据保持原本传输的时候需要解包,要使用*args,**kwarg
8. 类与属性
8.1 类属性;类方法
类属性: 类创建的属性,只在内存空间中保存一份,共享给所有对象,并且在实例对象储存空间中都会保存。
类方法: 实例对象独有的,不会共享给其他类与其他对象。保存在自己内存空间中。
8.2 类方法;实例方法
类方法: 类自己调用,至少传入一个cls 参数(可以传入参数)。并且有装饰器:@classmathod
实例方法: 由对象调用,中至少传入self 参数,执行时自动将类创建的给对象传给self
8.3 静态方法
静态方法: 由类调用,没有默认参数。@staticmethod
9. @property 属性
9.1 基础
作用: 在类中返回属性值
注意点:
- 必须有返回值,本质是经过一系列复杂的运算返回一个结果值。
- 在调用时不需要括号。
两种用法 :
- 装饰器——
@property - 类属性方法
9.2 装饰器使用方法
class Goods(object):
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8
@property
def price(self):
new_price = self.original_price * self.discount
return new_price
@price.setter
def price(self, value):
self.original_price = value
@price.deleter
def price(self):
del self.original_price
obj = Goods()
print(obj.price)
obj.price = 200
print(obj.price)
del obj.price
@property ——取值(获取)@xxx.setter ——设置值(修改)@xxx.deleter ——删除值
注意: 设置要传入新值的参数
@price.setter
def price(self, value):
self.original_price = value
9.3 使用类属性方式实现
class Fll(object):
def get_bar(self):
return 'laowang'
def set_bar(self, value):
"""必须两个参数"""
return 'set value' + value
def del_bar(self):
return 'laowang'
BAR = property(get_bar, set_bar, del_bar)
obj = Fll()
result = obj.BAR
print(result)
property方法中有是个参数
- 第一个参数是方法名,调用对象.属性时自动触发
- 第二个参数是方法名,
调用对象.属性 = xxx 时自动触发执行。 - 第三个参数是方法名,调用
del对象.属性 时自动触发执行 - 第四个参数是字符串,调用
对象.属性.__doc__ ,此参数是该属性的描述信息。
10. 魔法属性
具有特殊含义的属性
10.1 __doc__
class Fll(object):
"""描述信息"""
def sun(self):
pass
# 输出描述信息
print(Fll.__doc__)
10.2 __module__ 和__class__
__moudle__ 表示操作对象在那个类__class__ 表示当前操作对象的类是什么
from test import Person
obj = Person()
print(obj.__module__)
print(obj.__class__)
10.3 __init__
- 初始化方法,在类创建对象时,自动执行。
- 创建一个内存空间
- 自动执行
10.4 __del__
10.5 __call__
注: __init__ 方法执行时是类创建对象触发的。而__call__ 触发是由对象名加()触发的。eg:对象()
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 执行 __init__
obj() # 执行 __call__
10.6 __dic__
class Province(object):
country = 'China'
def __init__(self, name, count):
self.name = name
self.count = count
def func(self, *args, **kwargs):
print('func')
# 获取类的属性,即:类属性、方法、
print(Province.__dict__)
# 输出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}
obj1 = Province('山东', 10000)
print(obj1.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 10000, 'name': '山东'}
obj2 = Province('山西', 20000)
print(obj2.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 20000, 'name': '山西'}
10.7 __str__
在打印对象名时,输出__str__ 的返回值。
class Foo:
def __str__(self):
return 'laowang'
obj = Foo()
print(obj)
# 输出:laowang
以上转载于:https://www.zhihu.com/question/357357801/answer/2712220871?
?Python好课分享,有帮助的可以收藏起来慢慢学:?
?python大数据方向
2022最新大数据Hadoop入门视频教程,最适合零基础自学的大数据Hadoop教程 2022年大数据spark3.2入门Spark全套视频教程,4天spark3.2快速入门到精通,全网首套基于Python语言的spark教程 2022年MySQL基础入门2022最新MySQL知识精讲+mysql实战案例_零基础mysql数据库入门到高级全套教程
Python+大数据开发 MySQL数据库:2022最新MySQL知识精讲+mysql实战案例_零基础mysql数据库入门到高级全套教程 Hadoop入门:2022最新大数据Hadoop入门视频教程,最适合零基础自学的大数据Hadoop教程 Hive数仓项目:大数据项目实战教程_大数据企业级离线数据仓库,在线教育项目实战(Hive数仓项目完整流程)
PB内存计算 Python入门:全套Python教程_Python基础入门视频教程,零基础小白自学Python必备教程 Python编程进阶:Python高级语法进阶教程_python多任务及网络编程,从零搭建网站全套教程 spark3.2从基础到精通:Spark全套视频教程,4天spark3.2快速入门到精通,全网首套基于Python语言的spark教程 Hive+Spark离线数仓工业项目实战:全网首次披露大数据Spark离线数仓工业项目实战,Hive+Spark构建企业级大数据平台
|