Python 类 语法总结

从病毒分析到安全研究:手把手教你用OD破解加壳程序的反调试机制 本文深入探讨了如何识别并绕过加壳程序的反调试机制,特别是针对使用IsDebuggerPresent等API检测的防护手段。通过实战案例和工具链配置,详细介绍了逆向工程中的关键技巧,包括内存补丁、硬件断点定位OEP等,帮助安全研究人员有效突破软件保护技术。 阅读详情

Python 类 语法总结

两句废话

最近复习 Python,把自己看到的一些 Python 语法中需要注意的点总结在这里。

名称和对象

由于 Python 的赋值操作为引用赋值,所以多个变量名可以绑定到同一个对象上。这种特性的好处表现为,因为别名在某些方面表现得像指针,所以传递一个对象的代价很低,而且函数修改了作为参数传递的对象,调用者也看得到更改。

Python 作用于和命名空间

这个地方的知识点没怎么看懂,先写在这里,后面有机会再填坑

namespace 是一个从名字到对象的映射。和其他编程语言的作用一样,命名空间可以隔离不同命名空间的变量。

  • 一个函数的本地命名空间在这个函数被调用时创建,并在函数返回或抛出一个不在函数内部处理的错误时被删除。每次递归调用都会又它的本地命名空间。

  • 一个 作用域 是一个命名空间可直接访问的 Python 程序的文本区域。 这里的 “可直接访问” 意味着对名称的非限定引用会尝试在命名空间中查找名称。

  • 如果一个名称被声明为全局变量,则所有引用和赋值将直接指向包含该模块的全局名称的中间作用域。 要重新绑定在最内层作用域以外找到的变量,可以使用 nonlocal 语句声明为非本地变量。 如果没有被 nonlocal 声明为非本地变量,这些变量将是只读的(尝试写入这样的变量只会在最内层作用域中创建一个 新的 局部变量,而同名的外部变量保持不变)。

  • global 语句可被用来表明特定变量生存于 全局作用域 并且应当在其中被重新绑定; nonlocal 语句表明特定变量生存于 外层作用域 中并且应当在其中被重新绑定。

    例子:

    def scope_test():
        def do_local():
            spam = "local spam"
    
        def do_nonlocal():
            nonlocal spam
            spam = "nonlocal spam"
    
        def do_global():
            global spam
            spam = "global spam"
    
        spam = "test spam"
        do_local()
        print("After local assignment:", spam)
        do_nonlocal()
        print("After nonlocal assignment:", spam)
        do_global()
        print("After global assignment:", spam)
    
    scope_test()
    print("In global scope:", spam)
    
    # 代码输出
    """
    After local assignment: test spam
    After nonlocal assignment: nonlocal spam
    After global assignment: nonlocal spam
    In global scope: global spam
    """
    

    局部 赋值(这是默认状态)不会改变 scope_test 对 spam 的绑定。 nonlocal 赋值会改变 scope_test 对 spam 的绑定,而 global 赋值会改变模块层级的绑定。

定义类

通过关键字 class 定义一个类,class 之后为类的名称并以冒号结尾

class ClassName:
   """类的帮助信息"""   #类文档字符串
   class_suite  #类体

创建实例对象

类实例化类似函数调用方式(类的 实例化 是使用函数表示法)

# "创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
# "创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)

实例对象的属性引用

实例对象的属性引用通过 ObjectName.MethodName 实现,即通过 . 运算符实现

访问限制

Python 中对象可以通过访问符直接访问类的属性和方法。如果想内部属性不被外部访问,可以把属性的名称前加上两个下划线 __,使其变为私有属性,只有类内部能够访问。单下划线开头的实例变量虽然外部可以被访问,但是约定这样的变量应该被是为私有变量。

使用双下划线开始会导致访问名称变成其他形式。这种修改的作用是继承——这种属性通过继承是无法被覆盖的。如:

class B:
    def __init__(self):
        self.__private = 0

    def __private_method(self):
        pass

    def public_method(self):
        pass
        self.__private_method()

在 B 类中,私有属性会被分别重命名为 _B__private 和 _B__private_method

有时候要定义的一个 变量和某个保留关键字 冲突,这时候可以使用 单下划线 作为后缀,例如:

lambda_ = 2.0 # Trailing _ to avoid clash with lambda keyword

需要区别的是,Python 中以双下划线开头和结尾的对象,是特殊对象 __XXX__

继承

类的继承语法如下:

class 派生类名(基类名)
    ...

多重继承的语法如下:

class SubClassName (ParentClass1[, ParentClass2, ...]):
    ...

派生类同样支持 Java 和 C++ 中的方法的重写、方法重载以及运算符重载。

Python 对象销毁

Python 的垃圾回收采用 Java 垃圾回收相同的技术实现,即采用引用计数实现变量垃圾回收。

修改实例的字符串表示

要改变一个实例的字符串表示,可重新定义它的 __str__() 和 __repr__() 方法。例如:

class Pair:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return 'Pair({0.x!r}, {0.y!r})'.format(self)

    def __str__(self):
        return '({0.x!s}, {0.y!s})'.format(self)

内置的 repr() 函数返回这个字符串,跟我们使用交互式解释器显示的值是一样的。 str() 方法将实例转换为一个字符串,使用 str() 或 print() 函数会输出这个字符串。

>>> p = Pair(3, 4)
>>> p
Pair(3, 4) # __repr__() output
>>> print(p)
(3, 4) # __str__() output
>>>

自定义 repr() 和 str() 通常是很好的习惯,因为它能简化调试和实例输出。

让对象支持上下文管理协议

为了让一个对象兼容 with 语句,类的定义中需要实现 __enter__() 和 __exit__() 方法。 例如,考虑如下的一个类,它能为我们创建一个网络连接:

from socket import socket, AF_INET, SOCK_STREAM

class LazyConnection:
    def __init__(self, address, family=AF_INET, type=SOCK_STREAM):
        self.address = address
        self.family = family
        self.type = type
        self.sock = None

    def __enter__(self):
        if self.sock is not None:
            raise RuntimeError('Already connected')
        self.sock = socket(self.family, self.type)
        self.sock.connect(self.address)
        return self.sock

    def __exit__(self, exc_ty, exc_val, tb):
        self.sock.close()
        self.sock = None

from functools import partial

conn = LazyConnection(('www.python.org', 80))
# Connection closed
with conn as s:
    # conn.__enter__() executes: connection open
    s.send(b'GET /index.html HTTP/1.0\r\n')
    s.send(b'Host: www.python.org\r\n')
    s.send(b'\r\n')
    resp = b''.join(iter(partial(s.recv, 8192), b''))
    # conn.__exit__() executes: connection closed

当出现 with 语句的时候,对象的 __enter__() 方法被触发, 它返回的值(如果有的话)会被赋值给 as 声明的变量。然后,with 语句块里面的代码开始执行。 当 with 代码块中的代码执行结束后,__exit__() 方法被触发进行清理工作。不管 with 中的代码块发生什么,该过程一定会被执行完,即使发生了异常。

使代码在 with 语句中执行,可以完成加锁和解锁的一些繁琐而必要的工作。

创建大量对象时节省内存方法

当程序要创建大量(可能上百万)的对象,会导致占用很大的内存。对于主要是用来当成 简单的数据结构 的类而言,你可以通过给类添加 __slots__ 属性来极大的减少实例所占的内存。

class Date:
    __slots__ = ['year', 'month', 'day']
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

当你定义 __slots__ 后,Python就会为实例使用一种更加紧凑的内部表示。 但是会产生以下几点影响:

  1. 该不能再给实例添加新的属性了,只能使用在 __slots__ 中定义的那些属性名
  2. 定义了slots后的类不再支持一些普通类特性了,比如多继承。Python的很多特性都依赖于普通的基于字典的实现

所以,尽管slots看上去是一个很有用的特性,很多时候还是得减少对它的使用冲动。

创建可管理的属性

如果想给某个实例的属性增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。可以将它定义为一个 property,即用 @property 装饰器修饰。给一个属性增加简单的类型检查的例子:

class Person:
    def __init__(self, first_name):
        self.first_name = first_name

    # Getter function
    @property
    def first_name(self):
        return self._first_name

    # Setter function
    @first_name.setter
    def first_name(self, value):
        if not isinstance(value, str):
            raise TypeError('Expected a string')
        self._first_name = value

    # Deleter function (optional)
    @first_name.deleter
    def first_name(self):
        raise AttributeError("Can't delete attribute")

"""
>>> a = Person('Guido')
>>> a.first_name # Calls the getter
'Guido'
>>> a.first_name = 42 # Calls the setter
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "prop.py", line 14, in first_name
        raise TypeError('Expected a string')
TypeError: Expected a string
>>> del a.first_name
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
AttributeError: can`t delete attribute
>>>
"""

Properties还是一种定义动态计算attribute的方法。 这种类型的attributes并不会被实际的存储,而是在需要的时候计算出来。

import math
class Circle:
    def __init__(self, radius):
        self.radius = radius

    @property
    def area(self):
        return math.pi * self.radius ** 2

    @property
    def diameter(self):
        return self.radius * 2

    @property
    def perimeter(self):
        return 2 * math.pi * self.radius

"""
>>> c = Circle(4.0)
>>> c.radius
4.0
>>> c.area  # Notice lack of ()
50.26548245743669
>>> c.perimeter  # Notice lack of ()
25.132741228718345
>>>
"""

不要写有大量重复代码的property定义, 重复代码会导致臃肿、易出错和丑陋的程序。通过使用装饰器或闭包,有很多种更好的方法来完成同样的事情。

参考链接

docs.python

菜鸟教程——Python

个人博客网站——Python中的面向对象编程

python3-cookbook —— 类与对象

macOS 12.7.6部署Ollama+Dify避坑指南 本文介绍了在macOS 12.7.6系统下部署Ollama和Dify的详细步骤及避坑指南。主要内容包括:1)关闭系统完整性保护(SIP)以允许修改系统目录;2)安装特定版本的Docker(2.1.0.5)和docker-compose(v2.38.2)以避免兼容性问题;3)配置Ollama服务并下载nomic-embed-text和deepseek-r1:7b模型;4)针对macOS调整Dify的docker配置文件,包括延长超时时间、修改存储路径、增加资源限制等关键设置。文中提供了完整的命令操作步骤和配置 阅读详情

相关推荐

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

Python | 基础语法总结(超详细)

变量名称 = 变量的值变量名称:每一个变量都有自己的名称,称为:变量名,也就是变量本身= :赋值,表示将等号右边的值,赋予左边的变量变量的值:每一个变量都有自己存储的值(内容),称为:变量值> *#定义一个变量,用来记录钱包余额*> *#输出变量的内容*> print("钱包还有:" , money) *# print输出多个数据时,用,隔开*三引号定义法,与多行注释写法相同,支持换行操作。使用变量接收它,它就是字符串,不适用变量接收它,它就可以作为多行注释使用。

m0_62283350的博客 3万+

Codex本地部署指南:从环境配置到API集成实战

Codex作为OpenAI推出的代码生成模型,能够根据自然语言描述自动生成代码片段,大幅提升开发效率。这次我们重点分析Codex的本地部署方案、硬件门槛、接口调用方式和实际使用效果,帮助开发者判断是否值得投入时间部署。 从技术架构看,Codex基于GPT-3模型微调,专门针对代码生成任务优化。最新版本支持多种编程语言,包括Python、JavaScript、Java、C++等主流语言。对于国内开发者来说,最关心的是能否在本地环境稳定运行,以及是否需要特殊网络配置。 1. 核心能力速览 能力项 技术说明 模型

weixin_33309048的博客 525

Python常用基础语法知识点大全合集,看完这一篇文章就够了

Python 是一门独特的语言,快速浏览一下他的要点:变量:无需指定变量类型,也不需要提前声明变量。变量复制的一个例子。使用切片来重新分配空间:Python 原生的数据结构包括:细分为整数(int)与浮点数(float)两种。首字母大写 True / False.序列主要包括字符串(str)、列表(list)与元祖(tuple)三类。序列索引规则:切片:切片的索引是左闭右开的。序列通用函数:字符串(str)写于一对双引号或单引号内。用 str() 可以强制转换为字符串。分割与连接: 与 .紧切: 去掉字符串

weixin_73136678的博客 1万+

Deepseek+Word插件:一键搞定论文翻译与润色的学术写作新革命

本文介绍了Deepseek Word插件如何革新学术写作流程,实现论文翻译与润色的一键操作。该插件深度集成于Word环境,能智能完成中英互译、语法修正、术语统一及逻辑优化,显著提升写作效率与文本质量,是研究者的高效AI助手。

weixin_29252171的博客 513

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

▲什么是类?类有什么作用?

什么是类? 类是将同类对象的共同属性和行为抽象出来形成的一个相对复杂的数据类型, 这与结构体一样,都是为了描述一个相对复杂的对象。 类与对象是什么关系? *类相当于设计出来的图纸,对象相当于产品1.对象是现实中的对象在程序中的模拟。2.类是同一类对象的抽象,对象是类的某一特定实体。3.定义类的对象,才可以通过对象使用类中定义的功能。 类和结构体有什么区别呢? 1.类是C++中对于C语言中的结构体的延伸1)类相比与结构体,它可以将函数作为成员。2)结构体和类都可以被访问(对象名.成员名/对象指针-&

phantomthief1412的博客 3万+

Visual Studio Git 使用指南

Visual Studio 2022深度集成了Git功能,提供了直观的图形界面管理源代码。本文详细介绍了VS中Git的使用方法:从环境准备、克隆/创建仓库开始,重点讲解了"Git更改"窗口的日常操作,包括查看修改、暂存文件、提交推送等。同时涵盖了分支管理、查看历史、解决冲突等核心功能,以及储藏、重置等高级操作。文章还提供了实用技巧,如提交规范、频繁提交等最佳实践。VS的Git集成覆盖了日常开发需求,图形界面与命令行可互补使用,适合各层次开发者高效管理代码版本。

guigenyi的专栏 1570

Python基础语法体系(详细)

Python基础语法体系 一:基本数据类型及操作 二:程序的控制结构 三:函数和代码复用 四:组合数据类型

Climb_Ma的博客 3万+

Oracle数据库安装及配置(Oracle19c)

Windows 10安装Oracle 19c教程

weixin_69200200的博客 2万+

QT上位机开发(掌握一点c++基础)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 c++是c语言的补充和扩展,本身的语法构成也是在一直迭代中。相信很多同学上大学读书的时候,或多或少对c语言有所了解,对它的变量、指针、函数也应该不陌生。既然大家都有c语言基础的话,那么在这方面稍微拓展一下的话,就可以学会c++了。当然c++本身的内容很多,很多方面还很琐碎,但我们学习的时候还是应该把精力放在那些经常使用到的语法上面。

嵌入式-老费,一个分享专业嵌入式知识的blog 1131

Python语法(全)

Python基础语法

boldht的博客 4万+

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3812

Python语法进阶——类

参考:https://www.bilibili.com/video/BV1wD4y1o7AS?p=112&spm_id_from=pageDriver&vd_source=541ccdf13b275290c43166e1762b6954

m0_63997099的博客 4265

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

为什么Python类语法应该不同?

做过python的人你会发现想要的东西跟它原有的是不同的。Python对我来说是真的是这样。如果可以的话,对于Python中很多的我想要改的东西,我有很多的想法。现在我向您讲述其中一个:类定义的语法。 但是,让我们先从定义函数的语法开始。它有一个非常好的特性:函数定义看起来像它们相应的函数调用。函数定义如下: def func_name(arg1, arg2): 当您调用该函数时,您使用类似的语...

QQ2352108083的博客 175

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

头歌python 类的基础语法

任务描述Python 是一门面向对象的语言。面向对象编程 - Object Oriented Programming(简称 OOP)是一种编程思想,在面向对象编程中,把对象作为程序的基本单元,把程序视为一系列对象的集合。一个对象包括了数据和操作数据的方法,消息传递成为联系对象的方法。对象可按其性质划分为类,对象也就是类的实例。类是用来描述具有相同的属性和方法的对象的集合,即抽象的集合。例如书这个类,它代表着所有书,它具有书所共有的属性:书名、版本、作者和出版日期,它也具有所有书都共有的方法:销售。

2401_87914305的博客 1062

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

python为什么用类_为什么Python类语法应该不同?

如果您已经使用了任何编程语言很长一段时间,您就会发现您想要的东西跟它原有的是不同的。Python对我来说是真的是这样。如果可以的话,对于Python中很多的我想要改的东西,我有很多的想法。现在我向您讲述其中一个:类定义的语法。但是,让我们先从定义函数的语法开始。它有一个非常好的特性:函数定义看起来像它们相应的函数调用。函数定义如下:def func_name(arg1, arg2):当您调用该函数...

weixin_39766071的博客 81

62.Python 类的3要素语法

1. 定义类的语法 2. pass语句的作用 3.我们学的5个缩进语法 4.类的属性 5.类的方法 6. 创建对象 7.类在爬虫中的应用 8. 总结

weixin_63986098的博客 1032

python基础语法复习06——类与对象

本文介绍了Python面向对象编程的核心概念,包括类与对象、属性与方法。主要内容包括:1. 类与对象的基本概念,类作为模板和对象作为实例的关系;2. 实例属性和类属性的定义与使用;3. 实例方法和类方法的定义与调用方式。文章通过学生类、银行账户等示例展示了如何定义类、创建对象,并详细说明了不同属性的访问方式以及实例方法和类方法的区别与适用场景。最后还提到了Python类可以动态修改属性的特性。

qq_73960031的博客 1274

python定义语法,Python类定义语法

Is there a difference betweenclass A:...andclass A():...I just realized that a couple of my classes are defined as the former and they work just fine. Do the empty parenthesis make any difference?解决方案...

weixin_30711615的博客 164

Python3中类的高级语法及实战

anaconda3最新版安装|使用详情 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3中多线程安全解决方案 python3基础|高级语法实战 异常Error: Please select a valid Python interpreter解决方案 Python3中类的高级使用技巧

天涯芳草 580

python:python基础语法五,类和对象

python基础语法 文章目录python基础语法什么是对象?面向对象(oop)类(class)使用类创建对象的流程类的定义创建对象的流程类的基本结构对象的创建__init__(self)方法 什么是对象? - 对象是内存中专门用来存储数据的一块区域。 - 对象中可以存放各种数据(比如:数字、布尔值、代码) - 对象由三部分组成: 1.对象的标识(id) 2.对象的类型(type)...

雷爷的博客 1489

python 类_为什么Python类语法应该不同?

如果您已经使用了任何编程语言很长一段时间,您就会发现您想要的东西跟它原有的是不同的。Python对我来说是真的是这样。如果可以的话,对于Python中很多的我想要改的东西,我有很多的想法。现在我向您讲述其中一个:类定义的语法。但是,让我们先从定义函数的语法开始。它有一个非常好的特性:函数定义看起来像它们相应的函数调用。函数定义如下:def func_name(arg1, arg2):当您...

weixin_39717443的博客 56

python定义语法_Python类定义语法

Is there a difference betweenclass A:...andclass A():...I just realized that a couple of my classes are defined as the former and they work just fine. Do the empty parenthesis make any difference?解决方案...

weixin_39629617的博客 119

Python高级语法:type类

type。

weixin_74382730的博客 1698
上一篇: Python 基础语法 Pythonic 部分的总结
下一篇: windows 下人脸识别 face_recognition dlib 库安装
Mleeeeeee
博客等级 码龄10年 65粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值