|
# python 高级语法
## 01.GIL (全局解释器锁)
C语言python—(cpython )解释器的一个缺点
问题克服: 更换解释器,使用jpython或其他语言编写的解释器 使用其他语言编写程序 python可以直接调用其他语言
##02.深拷贝、浅拷贝 ●浅拷贝是对于一个对象的顶层拷贝(一变全变) 通俗的理解是:拷贝了引用(指向 ),并没有拷贝的内容 ●深拷贝是将一个对象重新复制一份,产生一个新的指向
##03.私有化 ●xx:共有便利 ●_x: 单前置下划线,私有化属性或方法,from somemodule import*禁止导入,类对象和子类可以访问 ●__xx:双前后下划线,避免与子类的中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到) ●__xx__:双前置下划线,用户名字空间的魔法对象或属·例如:__init__,__不要自己发明这样的名字 ● xx_:单后置下划线,用于避免与python关键词冲突
通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或属性)如:_Class__object)机制就可以访问private了。
- 路径搜索
●从上面列出的目录里依次查找要导入的模块文件 ●” 表示当前路径 ●列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序
程序执行时添加新的模块路径
1 2
| sys.path.append'/hone/itcast/xx') sys.path, insert(0, */hone/itcast/oox') # 可以确保先搜索这个路怪
|
- 重新导入模块
导入模块后,importmodule 不能重新导入模块,重新导入需要用 reload
##04.再论静态方法和类方法
1.类属性、实例属性
它们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,
●实例属性属于对象 ●类属性属于类
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Province(object): country =‘中国‘ def_ init (self, name): self.name = name
obj = Province('山东省')
print(obj.name)
Province. country
|
由上述代码可以看出[实例属性需要通过对象来访问] [类 属性通过类访问], 在使用上可以看出实例属性和类属性的归属是不同的。
2.实例方法、静态方法和类方法 方法包括:实例方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同 ●实例方法:由对象调用;至少一个self参数;执行实例方法时,自动将调用该方法的对象赋值给self ●类方法:由类调用;至少一个cls参数;执行类方法时,自动将调用该方法的类赋值给cls ; ●静态方法:由类调用;无默认参数;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Foo(object): def init_ (self, name): self.name = name def ord_ func(self): """定义实例方法,至少有一个self参数""" print('实例方法')
@classmethod def class_ func(cls): """定义类方法,至少有一个cls参数""" print('类方法')
@stat icmethod def static_func(): """定义静态方法, 无默认参数""" print('静态方法")
f = Foo("中国") #调用实例方法 f.ord_fouc()
# 调用类方法 Foo.class_func()
# 调用静态方法 foo.static_fouc()
|
对比 ●相同点:对于所有的方法而言·均属于类·所以在内存中也只保存一份 ●不同点:方法调用者不同·调用方法时自动传入的参数不同。
3.property属性 ●什么是property属性 —一种用起来像是使用的列属性一样的特殊属性,可以对应某个方法 ●property属性的定义和调用要注意以下几点: 1).定义时,在实例方法的基础上添加@property装饰器;并且仅有一个self参数 2).调用时无序括号
1 2
| 方法:foo_obj.func() property属性:foo_obj.prop
|
4.property属性的有两种方式
●装饰器即:在方法上应用装饰器
●类属性即:在类中定义值为property对象的类属性
4.1装饰器方式
在类的实例方法上应用@property装饰器
Python中的类有经典类和新式类,新式类 的属性比经典类的属性丰富。( 如果类继object,那么该类是新式类)
经典类,具有-种@property装饰器
1 2 3 4 5 6 7 8 9 10
| class Goods: @property def price(self): return "Laowang"
obj = Goods() result = obj.price print(result)
|
新式类,具有三种@property装饰器
注意 ●经典类中的属性只有一种访问方式,其对应被@property修饰的方法 ●新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名stter、@方法名deleter 修饰的方法 由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
4.2类属性方式,创建值为property对象的类属性
●当使用类属性的方式创建property属性时,经典类 和新式类无区别
1 2 3 4 5 6 7 8
| class Foo: def get_ bariself): return * laowang ' BAR = property(get bar)
obj = Foo() reuslt = obj.BAR # 自动调用get_ bar方法,并获取方法的返回值 print(reuslt)
|
property方法中有个四个参数
●第一个参数是方法名,调用对象.属性时自动触发执行方法 ●第二个参数是方法名,调用对象.属性= XXX时自动触发执行方法 ●第三个参数是方法名,调用del对象.属性时自动触发执行方法 ●第四个参数是字符串,调用对象.属性.__doc__ ,此参数是该属性的描述信息
●定义propery属性共有两种方式,分别是[装饰器] 和[类属性],而[装饰器]方式针对经典类和新式类又有所不同。 ●通过使用propery属性,能够简化调用者在获取数据的流程
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 一只小可乐! |