python的 __name__和__doc__属性
__name__属性
用于判断当前模块是不是程序入口,如果当前程序正在使用,__name__的值为__main__。
if __name__ == '__main__': # 文件为.test.py, 当直接运行本文件时执行以下代码
print("第一次测试:")
print("第二次测试:")
如果不添加if __name__ == '__main__',则 import test后就会执行 两次打印
添加if __name__ == '__main__':下方,这样既不会影响到本模块的执行,也不会影响到调用方。
__doc__属性
模块本身是一个对象,而每个对象都会有一个__doc__属性。该属性用于描述该对象的作用。
例如:
class MyClass:
"""A simple example class"""
def f(self):
'abcd'
print('hello world')
>>> print(MyClass.__doc__)
Out: A simple example class
>>> print(MyClass.f.__doc__)
Out: abcd
若没有 ’abcd’, 则输出 None
1. 类定义语法
类定义与函数定义 (def 语句) 一样必须被执行才会起作用。
在实践中,类定义内的语句通常都是函数定义,但也允许有其他语句,有时还很有用
2. 类对象
类对象支持两种操作:属性引用和实例化。
属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name。 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称。 因此,如果类定义是这样的:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
print( 'hello world' )
那么 MyClass.i 和 MyClass.f 就是有效的属性引用,将分别返回一个整数和一个函数对象。
>>> MyClass.i
Out: 12345
>>> MyClass.f
Out: <function __main__.MyClass.f(self)>
>>> x = MyClass() #实例化对象
>>> x.f()
Out: 'hello world'
类属性也可以被赋值,因此可以通过赋值来更改 MyClass.i 的值。
__doc__ 也是一个有效的属性,将返回所属类的文档字符串: "Asimple example class"。
类的 实例化 使用函数表示法。 可以把类对象视为是返回该类的一个新实例的不带参数的函数。 举例来说(假设使用上述的类):
x = MyClass()
创建类的新 实例 并将此对象分配给局部变量 x。
实例化操作(“调用”类对象)会创建一个空对象。 许多类喜欢创建带有特定初始状态的自定义实例。 为此类定义可能包含一个名为 __init__() 的特殊方法,就像这样:
def __init__(self):
self.data = []
当一个类定义了 __init__() 方法时,类的实例化操作会自动为新创建的类实例发起调用 __init__()。 因此在这个示例中,可以通过以下语句获得一个经初始化的新实例:
x = MyClass()
当然,__init__() 方法还可以有额外参数以实现更高灵活性。 在这种情况下,提供给类实例化运算符的参数将被传递给 __init__()。 例如,
>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
强调:
当一个类定义了 __init__() 方法时,类的实例化操作会自动为新创建的类实例发起调用 __init__()
当__init__() 还有额外的参数,则类可以实例化参数,除了self的参数。
Python有两个内置函数可被用于继承机制:
- 使用 isinstance() 来检查一个实例的类型: isinstance(obj, int) 仅会在 obj.__class__ 为 int 或某个派生自 int 的类时为 True。
- 使用 issubclass() 来检查类的继承关系: issubclass(bool, int) 为 True,因为 bool 是 int 的子类。 但是,issubclass(float, int) 为 False,因为 float 不是 int 的子类。
类:如果有父类,写在类名后面的括号里;如果没有父类,可以不写括号。
单下划线 、双下划线 、头尾双下划线的说明:
_foo:以单下划线开头的表示的是protected类型的变量,即保护类型只允许其本身与子类访问,不能用于 from module import *
__doo:双下划线的表示的是私有类型(privated)的变量,只能允许这个类本身进行访问
__foo__:双头尾下划线定义的是特列方法,类似___init__()之类的
- 类里定义函数时,语法规定第一个参数必须是self
- 类内定义函数时,如调用自身或父类的函数与变量,须用self. 引导,应该写为 self.函数名 或 self.变量名
class Animals:
def breathe(self):
print("breathing")
def move(self):
print("moving")
def eat(self):
print("eating animals")
class Mammals(Animals):
def breastfeed(self):
print("feeding young")
# __init__函数,在新对象实例化时会自动运行,用于给新对象赋初值
# 注意这是两个下划线
class Cats(Mammals):
def __init__(self,spots):
self.spots = spots
def catch_mouse(self):
print("catch mouse")
def left_foot_forward(self):
print("left foot forward")
def left_foot_backward(self):
print("left foot backward")
def dance(self):
self.left_foot_forward()
self.left_foot_backward()
self.left_foot_forward()
self.left_foot_backward()
if __name__ == "__main__":
kitty = Cats(10)
print(kitty.spots)
kitty.dance()
kitty.breastfeed()
kitty.move()
执行结果:
10
left foot forward
left foot backward
left foot forward
left foot backward
feeding young
moving