python学习_二

//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.utilsmycompany.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这种动态语言中,一个实例可以动态的设置属性以及方法。
如果想要类具备自身的属性,则直接在与定义方法同级下定义属性即可。
但是!!!这种方式下定义的属性是静态的,是所有实例、类共用的,但是子类不共用,修改子类父类无影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值