• 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:	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
    
  • 相关阅读:
    《Java面向对象编程》
    大学计算机基础考试系统(CS)
    企业物资管理系统
    IP.21出现的错误
    假如你的年龄超过了23···
    如何经营婚姻
    一张舞女图测试你的左右脑切换能力【我看到左右都转呢~】
    无法加载DLL(oci.dll)
    mongodb安装信息及有关命令
    loaded the "controller" nib but the view outlet was not set.问题解决
  • 原文地址:https://www.cnblogs.com/mapel1594184/p/14519851.html
Copyright © 2020-2023  润新知