适用于 python3.7,更新内容借鉴官方文档
https://docs.python.org/zh-cn/3.7/whatsnew/3.7.html
1 变量的定义
1.1 variable
公有变量
1.2 _variable
单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入
1.3 __variable
双前置下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到)
1.4 __variable__
双前后下划线,系统定义名字(自己不要定义哦)
1.5 variable__
单后置下划线,用于避免与Python关键词的冲突
class test(object):
def __init__(self):
self.num = 10
self._num = 20
self.__num = 30
t = test()
print(t.num) # 10
print(t._num) # 20
# print(t.__num) # AttributeError: 'test' object has no attribute '__num'
1.6 _
最常见的一种使用场景是作为变量占位符,使用场景明显可以减少代码中多余变量的使用。为了方便理解,_
可以看作被丢弃的变量名称,这样做可以让阅读你代码的人知道,这是个不会被使用的变量。
def func():
dic = [{'id': 1}, {'id': 2}, {'id': 3}]
for _ in dic:
print(_.get('id'))
func()
# 1
# 2
# 3
- __
双下划线
def func():
dic = [{'id': 1}, {'id': 2}, {'id': 3}]
for __ in dic:
print(__.get('id'))
func()
# 1
# 2
# 3
1.7 访问变量
class Test():
def __init__(self):
self.num = 10
self._num = 100
self.__num = 1000
t = Test()
print(t.num) # 10
print(t._num) # 100
# print(t.__num) # 'Test' object has no attribute '__num' 无法访问私有变量的原因居然是内部改了名字,可以用dir(t)进行查看
print(t._Test__num) # 虽然可以获取私有变量1000,但是强烈不建议
# print(dir(t))
# ['_Test__num', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_num', 'num']
2 导入模块的不同方法
2.1 from somemodule import *
不能导入或使用私有属性和方法
2.2 import somemodule
能导入并使用私有属性和方法
3 对类中的私有属性进行操作
3.1 getter 以及 setter 方法
- 类对象通过调用这两种方法对私有属性进行操作
class Test():
def __init__(self):
self.__num = 1000
def getter(self):
return self.__num
def setter(self, value):
self.__num = value
'''
类的私有属性:在外部不能访问也不能修改,但在内部可以
类的私有方法:在外部不能访问也不能修改,但在内部可以
'''
t = Test()
print(t.getter())
t.setter(10000)
print(t.getter())
print(t.__num) # 'Test' object has no attribute '__num'
3.2 property方法
- property 方法包含三个参数,分别为getter,setter,delter,分别对应 getter 方法,setter 方法,deleter 方法和方法说明。
- property()方法返回一个property属性,如果 t 是Test 的实例,那么 t.num 会调用 getter方法,t.num = value会调用 setter 方法,而del t.num 会调用 deleter 方法。
class Test():
def __init__(self):
self.__num = None
def getter(self):
return self.__num
def setter(self, value):
self.__num = value
def delter(self):
del self.__num
num = property(getter, setter, delter)
t = Test()
print(t.num)
t.num = 20
print(t.num)
del t.num
print(t.num) # 'Test' object has no attribute '_Test__num'
- 这里del后之所以会报错,参照以下代码
a = 1
print(a) # 1
del a
print(a) # name 'a' is not defined 引用计数为0,自动回收空间
3.3 @property
- 我们可以把 property() 方法当成一个装饰器来使用,使用 @property对方法进行装饰
- 装饰器 @property 把方法get_num() 转换成了与方法名同名的 getter 方法
- 调用方法和property()方法一样
class Test():
def __init__(self):
self.__num = 10
@property
def get_num(self):
return self.__num
@get_num.setter
def get_num(self, value):
self.__num = value
@get_num.deleter
def get_num(self):
del self.__num
t = Test()
print(t.get_num)
# 10
t.get_num = 100
print(t.get_num)
# 100
4 路径引入问题
4.1 os.path.dirname
import os
# 当前文件的绝对路径,包括文件名
# D:/test_py/test.py
print(__file__)
# 当前文件的系统绝对路径,往往用于添加到环境变量BASE_DIR
# D: est_py est.py
print(os.path.abspath(__file__))
# 当前文件所在的目录
# D:/test_py
print(os.path.dirname(__file__))
# 文件所在目录的上一级目录
# D:/
print(os.path.dirname(os.path.dirname(__file__)))
# 当前文件所在的目录
# D: est_py
print(os.path.dirname(os.path.abspath(__file__)))
5 三元运算
a = 1
b = 2
h = a-b if a>b else a+b
print(h)
6 any和all
def func1(num):
if num > 30:
return True
def func2(num):
if num < 40:
return True
print(any([func1(15), func2(41)])) # False
print(all([func1(45), func2(31)])) # True