//2020.04.28
模块。
mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
mycompany是一个包,abc和xyz是其下面的模块。
同时,每个包下都有一个_init_.py文件用于指示这是一个包而不是普通目录。
并且_init_.py代表包名这个模块。
如上面的_init_.py本身就是一个模块,但是不能使用_init_这个名字来引用,而是要使用其指示的包名(这里是mycompany)。
mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ utils.py
文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。
创建模块时一般不要与系统自带模块同名,因为如果同名系统模块将无法导入。
任何模块代码的第一个字符串都被视为模块的文档注释;
通常在定义模块时需要在最后加上下列代码:
if __name__ == '__main__':
//调用模块中的方法
这样主要是为了在
命令行运行模块文件
时继续测试。此时如果是在命令行导入自定义模块并调用内部方法,则该if判断为真,执行。
但是如果是在其他地方调用该模块则if判断为假。
python中也有private以及public这种属性,只不过使用“_”、“__”和“”来实现。
比如:
def _fuc1():
此时函数fuc1就是一个private类函数。
而:
def fuc2():
此时函数fcu2就是一个public类函数。
但是,python并不像java那样禁止在外部访问private修饰的方法以及属性。在外部还是可以访问,只是说,不应该访问而已。
python中的类:
使用:
class className(继承的类名(没有就是object)):
def __init__(self,属性列): //相当于构造函数
//其他的方法
从上面可以看出,__init__函数起着构造函数的作用,其第一个参数永远的self,表示创建的示例本身;随后的属性列是在创建这个类时创建者认为的必需的属性(如id、name等,当然不一样的类不一样)。而之所以说是必需的属性,因为在python中可以对一个实例动态的创建属性,如下所示:
//假设创建了一个Student类,__init__函数中有两个必需属性。
s1 = Student("id1","name1")
s1.score = 120
此时就动态的给s1这个Student类的实例创建了一个新的属性–score,但是仅仅是作用这个实例而已。
并且,在创建内部其他方法时,第一个参数也一定是self。
对类的属性(必需)加上private限定于对方法加上private限定效果不一样,
在对类内部的必需属性加上private限定(此时是使用双下划线“__”限定的方式,单下划线“_”修饰的依然可以访问,只不过定义的时候类定义者不想让限定属性被访问,也就是希望调用者自觉不访问)时,该类的实例是无法直接访问这些加限定的属性,但是可以访问到加限定的方法。
此时,如果直接访问,会报错:
has no attribute...
可以看出,在定义类时如果对属性加上private限定,在该类外部看起来是没有这个加上限定的属性的。
当然,如果硬要访问或修改,可以定义setter、getter方法。
使用type()函数返回变量的类型。
使用isinstance()判断一个变量是否是指定的类型或者子类,用法如下:
>>>a = Dog()
>>>isinstance(a,Dog')
true
//或者
>>>isintance(a,(Dog,Plant)) //判断变量a 是否是其中一种
true
使用内置方法getattr()、setattr()以及hasattr()操纵一个指定对象的属性
。使用如下:
//假设以及定义 a3 = Husky("myname")
>>>getattr(a3,'name')
myname
>>>setattr(a3,'name','changedname')
>>>getattr(a3,'name')
changedname
>>hasattr(a3,'name')
true
注意,这三个函数对于类的实例和类作用的效果不一样:
>>>hasattr(Husky,'name')
false
>>>hasattr(a3,'name')
true
-
同时getattr()函数还有三个参数的用法:
>>>getattr(a3,'id',none)
none
此时,如果传入的第一个参数对应的实例没有第二个参数值对应的属性,则会返回第三个的值。
如果没有第三个参数但是传入的第二个参数值对应的属性不存在,则会报错。
因此可以通过传入第三个参数的方式解决这种报错的情况。
getattr()函数有返回值,具体见下面例子:
>>>grun = getattr(a3,'run')
>>>grun()
huksky is running...
可以看出getattr()函数可以获取一个类似指针的东西。
与hasattr()函数一样,getattr()函数也可以传入第三个参数,用法一样。
tips:
①这三种方法一般用于类是实例,而用于类的时候不会得到想要的结果。
因为一般而言,我们定义类的时候一般都是在__init__方法里面添加属性,这种方法添加的属性实际上属于实例,也就是说类并不具有在__init__方法中添加的属性,这也是上面三种方法用于实例和类的差别、不能获得想要的结果的原因,这也是为什么在类中定义方法的时候第一个参数一定是self的原因(可以理解为这个self对应实例)
但是,如果类中的方法/属性不是在__init__方法中定义/添加的,则可以通过上面三种方法获取到,也就是说这时候获取到的属性/方法不仅属于实例(肯定),而且还属于类。
②这三种方法使用的场景一般是:我们不知道传入的变量所具有的属性以及方法。如果知道则最好不要使用。
最后,学习一下类属性与实例属性。
通过上面的学习知道,在python这种动态语言中,一个实例可以动态的设置属性以及方法。
如果想要类具备自身的属性,则直接在与定义方法同级下定义属性即可。
但是!!!这种方式下定义的属性是静态的,是所有实例、类共用的,但是子类不共用,修改子类父类无影响。