type
status
date
slug
summary
tags
category
icon
password

一、认识属性

1. 实例属性

  • 定义方式:在__init__方法里用self.xxx定义
  • 场景:每个对象都有自己独特的属性值,比如学生的名字、年龄

2. 类属性

  • 定义方式:在类体内部、方法外部直接定义
  • 场景:大家都一样的数据,比如学校名称

3. 属性的访问

  • 实例属性:对象.属性名
  • 类属性:类名.属性名 或 对象.属性名
    • 当实例和类属性同名时,实例属性优先

二、方法的分类

1. 实例方法

  • 默认参数 self
  • 通过对象调用,能访问/修改实例属性

2. 类方法

  • @classmethod装饰,参数cls
  • 通过类调用,常用于修改类属性、生成对象等

3. 静态方法

  • @staticmethod装饰,没有默认参数
  • 与类、实例都没直接关系,放一些通用工具方法

场景对比

  • 实例方法:需要用到当前对象的数据
  • 类方法:只和类有关,想影响所有实例时(比如工厂方法、统计类总数)
  • 静态方法:逻辑独立,不依赖类或对象的任何状态(比如工具函数)
  • 代码运用
notion image

  • 测试结果
notion image

三、魔术方法

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
 
Leetcode刷题建议7.py-迭代器和生成器的区别及其各自实现方式和使用场景
Loading...