Python高级语法 谁还不知道?

目录

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()

注意:

  1. 元组中只有不可变类型数据,深拷贝与浅拷贝都不会变,(原因:元组是不可变的);若元组类中元素是可变类型的,浅拷贝不会变,深拷贝会变化。
  2. 切片是浅拷贝。
  3. 参数的传递实际传递的是引用。

应用: 深拷贝使用拷贝内容时不会影响原数据;浅拷贝使用拷贝数据时会影响原数据。

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导入注意点:

  1. import yy
  2. from xx import yy

两种方法导入模块的不同点: 在使用xx函数模块中yy函数,若yy = True (进行了赋值。)

​ 第一种导入方式,指向yy模块中函数xx这个函数。

​ 第二种导入方式,指向True这个值。

结果: 在主函数修改值时,1会成功,2会失败。

5. 封装,继承,多态——面对对象编程

  • 封装:时复杂函数更加简洁。
  • 继承:提高代码重用。
  • 多态:子类编写父类的同名方法,会优先调用子类的方法。

6. 多继承与__mro__ 方法

拓展:

  • 重写:调用同名称方法,之后调用的会覆盖之前调用的。
  • 重载:调用同类方法,通过传入参数类型的不同,调用对用的同名方法。(python中重载很弱)

__mro__方法:

  • 作用:查看当前类继承调用顺序,返回值是一个元组。
  • 使用方式: 类名.__mro__

继承父类的写法:

  1. 父类名.__init__(self, 参数)
  2. super.__init__(参数)
  3. super.(父类名.self).__init__(参数)

​ 说明:

​ 1.第一种继承父类写法,好处在于简介,缺点是:当d类继承b类,c类,b,c 类继承a类,d类会重复继承a。

2. 第二种会按照类的继承顺序继承不会导致重复调用。
2. 第三种,可以指定调用的父类名,根据继承顺序调用。

7. *args()-元组参数,**kwarg-字典参数

  • * 的目的在于告诉服务器特殊对待。
  • 当B函数在A函数中运行,要将argskwarg 数据保持原本传输的时候需要解包,要使用*args,**kwarg

8. 类与属性

  • 类对象;实例对象;类方法;类属性;实例属性

8.1 类属性;类方法

类属性: 类创建的属性,只在内存空间中保存一份,共享给所有对象,并且在实例对象储存空间中都会保存。

类方法: 实例对象独有的,不会共享给其他类与其他对象。保存在自己内存空间中。

8.2 类方法;实例方法

类方法: 类自己调用,至少传入一个cls参数(可以传入参数)。并且有装饰器:@classmathod

实例方法: 由对象调用,中至少传入self 参数,执行时自动将类创建的给对象传给self

8.3 静态方法

静态方法: 由类调用,没有默认参数。@staticmethod

9. @property 属性

9.1 基础

作用: 在类中返回属性值

注意点:

  1. 必须有返回值,本质是经过一系列复杂的运算返回一个结果值。
  2. 在调用时不需要括号。

两种用法

  1. 装饰器—— @property
  2. 类属性方法

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__': , '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': , 'func': , '__init__': }

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构建企业级大数据平台

你可能感兴趣的:(python,自学,编程,python,windows,numpy,自学python,c4python)