python 个人学习笔记
个人学习笔记
关键字
if __name__ == '__main__
if __name__ == '__main__': 是 Python 中一个常用的代码结构,它的作用是判断当前脚本是否作为主程序直接运行,还是被作为模块导入到其他脚本中使用。 以下详细解释:
__name__ 是 Python 中的一个内置变量,它表示当前模块的名称。
当一个 Python 脚本被直接运行时,__name__ 的值会被设置为 '__main__';
而当这个脚本被作为模块导入到其他脚本中时,__name__ 的值会是这个模块的名字(也就是脚本的文件名,不包
含 .py 后缀)。 以下是代码示例:
def main():print("This is the main function.")if __name__ == '__main__':main()
在上述代码中: 定义了一个 main 函数,函数内打印一句话。
接着使用 if __name__ == '__main__': 判断,当脚本直接运行时,__name__ 等于 '__main__',条件成立,会执行 main() 函数。
假设我们有另一个脚本 test.py,内容如下:
import module # 假设上面代码保存为module.py# 这里并不会执行module.py中的main函数
在 test.py 中导入了 module 模块,由于 module 模块是被导入使用,此时 module 模块中的 __name__ 是 'module',不等于 '__main__',所以 module 模块中 if __name__ == '__main__': 块内的代码不会执行。
if __name__ == '__main__': 的好处主要有:
代码组织清晰:将主程序逻辑放在 if __name__ == '__main__': 块内,可以使代码结构更清晰,便于区分哪些代码是在模块被导入时执行,哪些是在模块直接运行时执行。
便于测试:在开发模块时,可以在 if __name__ == '__main__': 块内编写测试代码,这些测试代码在模块被导入时不会执行,只有在直接运行该模块时才会执行,方便对模块进行功能测试。
__init__
- 定义
- 在 Python 中,
__init__
是一个特殊方法(也称为魔法方法或双下划线方法)。它是类中的构造函数,用于初始化类的实例对象。当创建一个类的新实例时,__init__
方法会被自动调用。
- 在 Python 中,
- 语法和参数
- 它的第一个参数总是
self
,代表类的实例本身。在__init__
方法内部,可以通过self
来定义和初始化实例的属性。除了self
之外,还可以有其他参数,这些参数用于接收在创建实例时传递的值。例如:
- 它的第一个参数总是
class MyClass:def __init__(self, parameter1, parameter2):self.attribute1 = parameter1self.attribute2 = parameter2
- 这里的
parameter1
和parameter2
是在创建MyClass
的实例时需要传递的参数,通过__init__
方法,它们被赋值给了实例的属性self.attribute1
和self.attribute2
。
用途举例
- 初始化实例属性:假设要创建一个表示矩形的类
Rectangle
,可以在__init__
方法中初始化矩形的长和宽这两个属性。
class Rectangle:def __init__(self, length, width):self.length = lengthself.width = width
- 当创建
Rectangle
类的实例时,就可以传入长和宽的值,这些值会被用来初始化实例的属性。例如rect = Rectangle(5, 3)
,这里5
被赋值给rect.length
,3
被赋值给rect.width
。 - 执行其他初始化操作:除了初始化属性,
__init__
方法还可以用于执行其他一些在实例创建时需要完成的任务,比如打开文件、建立数据库连接等。不过需要注意的是,在__init__
方法中尽量保持简洁,复杂的操作可以放在其他方法中。
类
class ProductData:def __init__(self, price, quantity):self.price = priceself.quantity = quantityself.highest_price = priceself.lowest_price = pricedef update_price(self, new_price):self.price = new_priceif new_price > self.highest_price:self.highest_price = new_priceelif new_price < self.lowest_price:self.lowest_price = new_pricedef get_total_value(self):return self.price * self.quantity# 示例使用
product = ProductData(10, 5)
print(f"初始价格: {product.price}")
print(f"初始数量: {product.quantity}")
print(f"初始最高价: {product.highest_price}")
print(f"初始最低价: {product.lowest_price}")product.update_price(15)
print(f"\n更新后的价格: {product.price}")
print(f"更新后的最高价: {product.highest_price}")
print(f"更新后的最低价: {product.lowest_price}")total_value = product.get_total_value()
print(f"\n总价值: {total_value}")
继承类
class Code_Tag:def __init__(self, code='0', name = '0', current_price=0):self.code_tag_dic = {'code' : code, # 标的代码'name' : name, # 标的名称'current_price' : 0, # 当前价格}class TradingCodeTag(Code_Tag):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.trade_operations = [] # 用于存储交易操作记录
这段代码定义了一个名为 TradingCodeTag
的类,它继承自 Code_Tag
类。下面是对这段代码的详细解释:
-
类定义:
class TradingCodeTag(Code_Tag):
这里定义了一个新的类
TradingCodeTag
,它继承自Code_Tag
类。这意味着TradingCodeTag
类将拥有Code_Tag
类的所有属性和方法。 -
构造函数:
def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.trade_operations = [] # 用于存储交易操作记录
这是
TradingCodeTag
类的构造函数。构造函数在创建类的实例时被调用。super().__init__(*args, **kwargs)
调用了父类Code_Tag
的构造函数,确保父类的初始化逻辑被执行。然后,self.trade_operations = []
创建了一个空列表trade_operations
,用于存储交易操作记录。 -
在Python中,
*args
和**kwargs
是用于处理可变数量参数的特殊语法。它们允许函数接受任意数量的位置参数(*args
)和关键字参数(**kwargs
)。
总结来说,TradingCodeTag
类是 Code_Tag
类的一个子类,它在继承父类属性和方法的基础上,增加了一个用于存储交易操作记录的列表 trade_operations
。这个列表可以用来记录每次买入或卖出操作的详细信息。
*args、**kwargs
*args
-
*args
用于接收任意数量的位置参数,这些参数会被打包成一个元组(tuple)传递给函数。例如:def example_function(*args):for arg in args:print(arg)example_function(1, 2, 3, 4)
输出:
1 2 3 4
**kwargs
-
**kwargs
用于接收任意数量的关键字参数,这些参数会被打包成一个字典(dictionary)传递给函数。例如:def example_function(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")example_function(name="Alice", age=30, city="New York")
输出:
name: Alice age: 30 city: New York
*args、**kwargs
在类的构造函数中,*args
和 **kwargs
通常用于确保子类的构造函数能够接受父类构造函数所需要的所有参数。例如:
class ParentClass:def __init__(self, arg1, arg2):self.arg1 = arg1self.arg2 = arg2class ChildClass(ParentClass):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 子类的其他初始化逻辑
在这个例子中,ChildClass
的构造函数使用 *args
和 **kwargs
来接收任意数量的参数,并将它们传递给父类 ParentClass
的构造函数。这样,ChildClass
的实例就可以接受父类构造函数所需的所有参数,同时也可以添加自己的初始化逻辑。