python私有变量+路径解读+三元运算+any/all

适用于 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:\test_py\test.py
print(os.path.abspath(__file__))

# 当前文件所在的目录
# D:/test_py
print(os.path.dirname(__file__))

# 文件所在目录的上一级目录
# D:/
print(os.path.dirname(os.path.dirname(__file__)))

# 当前文件所在的目录
# D:\test_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
posted @ 2021-03-11 18:44  狐狸大大爱吃糖  阅读(133)  评论(0编辑  收藏  举报