type
status
date
slug
summary
tags
category
icon
password
一、认识属性
1. 实例属性
- 定义方式:在
__init__
方法里用self.xxx
定义
- 场景:每个对象都有自己独特的属性值,比如学生的名字、年龄
2. 类属性
- 定义方式:在类体内部、方法外部直接定义
- 场景:大家都一样的数据,比如学校名称
3. 属性的访问
- 实例属性:对象.属性名
- 类属性:类名.属性名 或 对象.属性名
当实例和类属性同名时,实例属性优先
二、方法的分类
1. 实例方法
- 默认参数 self
- 通过对象调用,能访问/修改实例属性
2. 类方法
- @classmethod装饰,参数cls
- 通过类调用,常用于修改类属性、生成对象等
3. 静态方法
- @staticmethod装饰,没有默认参数
- 与类、实例都没直接关系,放一些通用工具方法
场景对比
- 实例方法:需要用到当前对象的数据
- 类方法:只和类有关,想影响所有实例时(比如工厂方法、统计类总数)
- 静态方法:逻辑独立,不依赖类或对象的任何状态(比如工具函数)
- 代码运用

- 测试结果

三、魔术方法
1. 为什么需要魔术方法
- 让对象支持加减、比较等常规操作
- 比如:让自定义
+ - * /
等运算,或者打印输出对象时有定制效果
2. 常见魔术方法定义
四、面向对象三大特性
1. 封装
- 把属性和方法包装到类里,外部通过接口访问
- 可以用
_
或__
做伪私有
2. 继承
- 子类继承父类的属性和方法
3. 覆盖(重写)
- 子类对父类的方法进行重写
4. super()用法
- 调用父类方法或属性,常用于扩展而不是完全替换
五、每日一题
题目:3201. 找出有效子序列的最大长度 I
给你一个整数数组
nums
。nums
的子序列 sub
的长度为 x
,如果其满足以下条件,则称其为 有效子序列:(sub[0] + sub[1]) % 2 == (sub[1] + sub[2]) % 2 == ... == (sub[x - 2] + sub[x - 1]) % 2
返回
nums
的 最长的有效子序列 的长度。一个 子序列 指的是从原数组中删除一些元素(也可以不删除任何元素),剩余元素保持原来顺序组成的新数组。
示例 1:
输入: nums = [1,2,3,4]
输出: 4
解释:
最长的有效子序列是
[1, 2, 3, 4]
。示例 2:
输入: nums = [1,2,1,1,2,1,2]
输出: 6
解释:
最长的有效子序列是
[1, 2, 1, 2, 1, 2]
。示例 3:
输入: nums = [1,3]
输出: 2
解释:
最长的有效子序列是
[1, 3]
。解题:
1、理解题目,题目表达的意思是,我需要再一串数组中找到最长的有效子序列,可以对数组进行删剪。
2、本来没什么头绪的,看了下提示
The possible sequence either contains all even elements, all odd elements, alternate even odd, or alternate odd even elements.
那么我就是需要找到全是奇数,或者全是偶数,或者奇偶交替的长度,将题目分成3种类型进行比较,首先是查找奇数和偶数的长度
3、接着查找奇偶交替的数组的长度,考虑定一个flag,以第一个数字为初始值,当下一个数字与flag不同,则长度加一的同时flag取反
- 这样就取出了奇偶交替的长度,同时跳过了相同的类型
4、最后对比取最值,返回最大值,完整代码:
- 结果正确
5、查看官方题解:
- 嗯?看不懂,问了了下ai,明白的他是使用的枚举,将偶偶..,偶奇..,奇偶..,奇奇..这4种都列出来,然后对数组进行4次遍历,通过
pattern[cnt % 2]
来判断当前需要的是奇数还是偶数,取最长的值,这个算法的优点在于可以从任何地方开始,找到合适的数组段。
- 针对这道题,我觉得贪心法更适合,因为数组只有这4种可能,除了找全奇数和全偶数,奇偶交替我不需要管第一个值是奇数还是偶数,既然要取最长,肯定从第一个开始,就根据第一位的奇偶性来决定下一位需要的数组,不合适就跳过,合适就
count + 1
并反向f = 1 - f
- 作者:sisui
- 链接:https://www.sisui.me//article/py-basic-cheatsheet-leetcode3201
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章