# 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了。

  1. 路径搜索
    ●从上面列出的目录里依次查找要导入的模块文件
    ●” 表示当前路径
    ●列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序

程序执行时添加新的模块路径

1
2
sys.path.append'/hone/itcast/xx')
sys.path, insert(0, */hone/itcast/oox') # 可以确保先搜索这个路怪
  1. 重新导入模块
    导入模块后,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(selr. name)
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 # 自动执行eproperty 修饰的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属性,能够简化调用者在获取数据的流程

文章作者: 南方Mr. Yu🍂
文章链接: https://yuyv.xyz/2019/02/22/%E5%9F%BA%E7%A1%80/%E9%AB%98%E7%BA%A7%E8%AF%AD%E6%B3%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 一只小可乐!
avatar
南方Mr. Yu🍂
个人技术博客
Follow Me
公告
This is my Blog
最新文章
软考
软考
MySQL
MySQL
SpringSecurity
SpringSecurity
jetLinks-pro
jetLinks-pro
docker
docker