《Python Tutorial》阅读笔记之方法对象

文章介绍了Python中类的内部变量类型,包括实例变量和类变量,并通过示例说明了类变量误用可能导致的数据共享问题。同时,讨论了如何正确设计类以确保每个实例有自己的数据。此外,提到了Python中的继承机制,包括单继承、多继承以及super()函数的作用。还讨论了异常处理,展示如何创建自定义异常类及其层次结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python类内的变量分为实例变量类变量

class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind                  # shared by all dogs
'canine'
>>> e.kind                  # shared by all dogs
'canine'
>>> d.name                  # unique to d
'Fido'
>>> e.name                  # unique to e
'Buddy'

如将列表作为类变量,下列中所有的狗共享同一个列表

class Dog:

    tricks = []             # mistaken use of a class variable

    def __init__(self, name):
        self.name = name

    def add_trick(self, trick):
        self.tricks.append(trick)

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks                # unexpectedly shared by all dogs
['roll over', 'play dead']

该类正确的设计方式

class Dog:

    def __init__(self, name):
        self.name = name
        self.tricks = []    # creates a new empty list for each dog

    def add_trick(self, trick):
        self.tricks.append(trick)

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks
['roll over']
>>> e.tricks
['play dead']

Note:

  1. python类中无法强制隐藏数据,(类似于C++中的ptivate属性变量)。以一个下划线开头的命名(如_name)会被处理为API的非公开部分(无论他是一个函数、方法或数据成员)。原理:python提供了name mangling (命名编码),任何形如 __spam 的标识(前面至少两个下划线,后面至多一个),被替代为 _classname__spam ,此语法不关注标识的位置,只要求在类定义内。
  2. 数据属性会覆盖同名的方法属性。为避免此类错误,可以大写方法名称的首字母,数据属性名称加一个前缀“_"
  3. 方法的第一个参数被命名为self,仅是一个约定,对于python,self没有任何特殊含义
class my_class:
    def func(a): # 可以不加self,但不加self后可读性变弱
        print(a)

my_class.func('123')

4.函数定义代码可以定义在类外,也可以将一个函数对象赋值给类中的一个局部变量

def f1(self, x, y):
    return min(x, x+y)

class C:
    f = f1
    def g(self):
        return 'hello world'
    h = g

5.每个值都是一个对象,因此每个值都有一个类(class)(也称为他的类型type),存储为object.__class__

a = 3
print(a.__class__) # <class 'int'>

继承

class DerivedClassName(BaseClassName):
    <statement-1>
    .
    .
    .
    <statement-N>

通过表达式引入基类也可

class DerivedClassName(modname.BaseClassName):
 	<statement-1>
    .
    .
    .
    <statement-N>

基类名必须与派生类定义在一个作用域内
Note:Python 中的所有方法本质上都是 方法,即派生类会覆盖基类的方法
在解析派生类的属性引用时,如果在类中找不到请求调用的属性,就搜索基类。如果基类是由别的类派生而来,这个规则会递归的应用上去。
python有两个用于继承的函数:

  • 函数isinstance()用于检查实例类型:如 isinstance(obj, int)检查obj的类型是不是int或是int派生类的实例
  • 函数 issubclass() 用于检查类继承,如issubclass(bool, int) 为 True,因为 bool 是 int 的子类

多继承

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

super()可以动态改变解析顺序,使得每个祖先类只调用一次,详见解说

补充

  1. 一个空的类定义可以实现类似于结构体的功能
class Employee:
    pass

john = Employee() # Create an empty employee record

# Fill the fields of the record
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000
  1. 异常也可以是类
class B(Exception):
    pass
class C(B):
    pass
class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
以下是关于 Python 学习笔记、教程及相关资源的详细介绍: ### 关于 Python 学习笔记 一份全面的 Python 学习笔记可以显著提升学习效率。以下是一些推荐的资源及其特点: #### 1. **Python学习笔记资源介绍** - 这份笔记源自哔哩哔哩“python_子木”的优质视频教程,由作者整理成文档形式[^1]。 - 笔记覆盖了从基础到进阶的知识点,适合初学者以及需要巩固知识的程序员。 - 建议结合原视频教程一起学习,以便更深入地理解知识点。 #### 2. **B站黑马程序员Python教程学习笔记** - 此仓库提供了 B 站黑马程序员 Python 教程的学习笔记压缩包文件名:“B站黑马程序员Python教程学习笔记.zip”[^2]。 - 它包含了详尽的 Python 编程技巧和实践案例,非常适合希望通过自学提高技能的学习者。 #### 3. **零基础入门教程——《Python学习笔记.pdf》** - 针对完全无编程经验的新手设计,这本 PDF 文件以通俗易懂的方式讲解 Python 的核心概念[^3]。 - 不仅介绍了基本语法,还融入了 Python 社区推崇的设计哲学,例如“优雅优于笨拙”,帮助读者形成良好的编码风格。 #### 4. **Python 练习题集合** - GitHub 上有一份经典的练习题合集 `100+ Python challenging programming exercises`[^4]。 - 提供了一系列难度逐渐增加的实际问题,能够有效检验并强化所学知识。 --- ### 如何获取这些资源? | 名称 | 下载地址 | |------|----------| | Python学习笔记(子木版) | [GitCode](https://gitcode.com/Premium-Resources/4fc26) | | 黑马程序员Python教程笔记 | 参考相关说明下载对应 ZIP 文件 | | 零基础入门PDF | [GitCode](https://gitcode.com/Open-source-documentation-tutorial/36951) | | Python挑战性练习题 | [GitHub](https://github.com/zhiwehu/Python-programming-exercises/blob/master/100+%20Python%20challenging%20programming%20exercises.txt) | 注意:在使用任何第三方资源之前,请确认其合法性,并尊重原创者的版权条款。 --- ### 示例代码片段 如果想验证自己的学习成果,可以通过解决实际问题来测试能力。下面是一个简单的例子,展示如何利用循环结构打印九九乘法表: ```python for i in range(1, 10): for j in range(1, i + 1): print(f"{j} * {i} = {i * j}", end="\t") print() ``` 运行以上程序后会得到如下输出: ``` 1 * 1 = 1 1 * 2 = 2 2 * 2 = 4 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 ... ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值