可调用对象的范围包括:用户定义的函数,匿名函数,内置函数和内置方法,类,在类中定义的方法,生成器函数,如果类实现了_call 方法,那么类的实例对象也是可调用对象。
1 变量
1.1 类属性和实例属性
1.1.1 类属性
类属性就是这个类所拥有的属性(变量),类属性被该类的所有实例对象所共有。对于公有的类属性,在类外可以通过类名或实例对象来访问。
类属性还分为公用类属性和私有类属性
公有类属性:在类外和类内都能访问,用类对象和实例对象都能访问
私有类属性:只能在类内访问,如果想在类外用类名或者实例对象访问,则
object._classname_attrName
object对象名,className类名,attrName私有类属性
声明方法:共有类属性直接定义在类里面即可,私有类属性需要在属性前面加两个下划线
1.1.2 实例属性
实例属性是该类的实例对象所拥有的,类对象无法拥有(通过类名无法访问实例属性)。
定义方式:定义在类的_init_函数里
1.2 全局变量和局部变量
按作用范围分为全局变量和局部变量
全局变量:在函数外创建的变量
局部变量:在函数内部创建的变量,局部变量不会影响全局变量。
函数1表示输出全局变量name,函数2只是表示创建一个局部变量,其他啥也没干
私有变量:单下划线开头的变量,这种变量只能在类内部访问。
2 函数
2.1 类方法、实例方法和静态方法
按方法所属类别分类,类方法、实例方法和静态方法
类方法可以通过实例对象和类对象调用
实例方法只能通过实例方法调用
静态方法只能通过类对象调用
2.1.1 类方法
定义:类方法是这个类所拥有的方法,
声明方法:需要用修饰器@classmethod来标识其为类方法。对于类方法,第一个参数默认为cls(当然也可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以cls作为第一个参数的名字,就最好用cls了),cls表示类本身。能够通过实例对象和类对象(类名)去访问。
2.1.2 实例方法
定义:就是普通的方法
声明方法:实例方法不需要任何修饰器,第一个参数默认为self,表示实例对象本身。
2.1.3 静态方法
魔法属性或方法:一个双下划线开头的函数或者变量称为魔法属性或方法。
*args:把函数参数列表里剩余的参数打包到一个元组里。
yield:
注意:函数也是对象,可以作为返回值来返回
该题return里的inner是函数,函数也是对象,所以这里只是返回了,没有执行
如果想要执行inner的话,写outer()()
_init_与_new_的区别
init需要传递参数self,self指向实例,执行init不返回实例
new需要传递参数cls,cls指向类本身,执行new会返回一个实例
单例模式,类只能实例化一个对象。可以用new来实现。
实现过程如下
class Bar(object):
__instance = None # 类变量,用于存储单例实例
def __new__(cls, *args, **kwargs):
if cls.__instance is None: # 检查是否已经创建了实例
cls.__instance = object.__new__(cls) # 调用 object.__new__ 创建实例
return cls.__instance # 返回单例实例
# 创建两个 Bar 类的实例
a = Bar()
b = Bar()
# 打印两个实例的内存地址
print(id(a)) # 输出 a 的内存地址
print(id(b)) # 输出 b 的内存地址
1. *args 含义: *args 用于收集函数调用时传递的任意数量的位置参数(即不带参数名的参数)。它将这些参数收集到一个元组中。
2. **kwargs 含义: **kwargs 用于收集函数调用时传递的任意数量的键值对参数(即带参数名的参数)。它将这些参数收集到一个字典中。
子类继承父类,
若子类没有自己的构造函数init,那么什么也不用写,子类会自动调用父类的构造函数,
若子类有自己的构造函数,父类的构造函数不再自动调用。如果想要使用父类的属性,则需要显式调用父类的构造函数super()._init_()
2.2 构造方法、析构方法、普通方法、魔术方法
2.2.1 构造方法
构造方法是用于创建对象时初始化实例的特殊方法,Python 中的构造方法是 __init__
。它会在对象创建时自动调用,用于为对象分配内存并初始化其属性。
- 定义方式:
__init__(self, ...)
2.2.2 析构方法
析构方法是对象销毁时自动调用的特殊方法,Python 中的析构方法是 __del__
。它用于清理对象资源,例如关闭文件、释放内存等。
- 定义方式:
__del__(self)
- 功能:在对象销毁前进行清理操作
示例
class MyClass:
def __init__(self, name):
self.name = name
print(f"{self.name} object created!")
def __del__(self): # 析构方法
print(f"{self.name} object destroyed!")
obj = MyClass("Alice")
del obj # 手动销毁对象
2.2.3 普通方法
普通方法是指除了构造方法、析构方法、类方法和静态方法之外的其他方法。它们通常用于对象的行为操作,访问对象的属性或修改对象的状态。
- 定义方式:普通方法的第一个参数通常是
self
。 - 功能:用于实现对象的具体行为
2.2.4 魔术方法
魔术方法是 Python 中以双下划线(__
)开头和结尾的方法,它们定义了对象的特殊行为。例如,__str__
方法用于返回对象的字符串表示,__add__
方法用于实现加法运算符的行为。
- 定义方式:通常以双下划线包围的方法名。
- 功能:定义特殊操作符、转换方法、对象比较等行为。
示例
class MyClass:
def __init__(self, value):
self.value = value
def __str__(self): # 魔术方法,返回对象的字符串表示
return f"MyClass object with value {self.value}"
obj = MyClass(42)
print(obj) # 自动调用 __str__ 方法
2.3 公共方法、保护方法、私有方法
公共方法是最常见的方法,
保护方法是类内部的方法,可以被子类调用
私有方法是类内部的方法,不可以被子类调用
3装饰器
3.1 定义
本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。
Python 装饰允许在不修改原有函数代码的基础上,动态地增加或修改函数的功能。
装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。
装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。装饰器的语法使用 @decorator_name 来应用在函数或方法上。
3.2 分类
3.2.1 函数装饰器
3.2.2 类装饰器
应用场景:实现单例模式,记录日志
3.2.3 内置装饰器
Python 提供了一些内置的装饰器,例如:
@staticmethod: 将方法定义为静态方法,不需要实例化类即可调用。
@classmethod: 将方法定义为类方法,第一个参数是类本身(通常命名为 cls)。
@property: 将方法转换为属性,使其可以像属性一样访问。
4 lambda表达式
语法格式:lambda arguments: expression
lambda
是 Python 的关键字,用于定义 lambda 函数。arguments
是参数列表,可以包含零个或多个参数,但必须在冒号(:
)前指定。expression
是一个表达式,用于计算并返回函数的结果。
该示例没有参数
f = lambda: "Hello, world!"
print(f()) # 输出: Hello, world!