python3学习特性

一 实例变量与类变量

class Pepple:
    __age=18
    __name="zhangfff"

    @classmethod
    def GetInfo(cls):
        print(cls.__name)

AAA=Pepple
AAA.GetInfo()

以上代码 利用类方法输出类变量

print(AAA.__name)

如果直接这样输出会报错,因为__开头的类变量收到保护

但是如果这样输出!!!!

class Pepple:
    __age=18
    __name="zhangfff"

    @classmethod
    def GetInfo(cls):
        print(cls.__name)

AAA=Pepple
print(AAA._Pepple__name)

 会得到  正确的结果, python对私有变量的保护是假的  会将其改名 为 _类名__XXXX 实例的 

__name 改成了 _Pepple__name  __age --->  _Pepple__age

class Pepple:
    __age=18
    __name="zhangfff"

    @classmethod
    def GetInfo(cls):
        print(cls.__name)

AAA=Pepple
AAA.__age=20
print(AAA.__age)
print(AAA._Pepple__age)

这里需要注意  这里虽然可以赋值 但是这个变量  AAA.__age  其实是实例变量 不是类变量

另外 以_一个下划线开头的 建议 也不要再方法外部直接访问(这种可以直接访问)

 二  _ 下划线使用

for  _ in range(1,10):
    print(_)

一般再不用 _的时候 也就是 可以用_ 代替一般的i

四 python3的魔法方法

class Foo:
    """
    this is the dockmet
    """
    def func(self):
        pass

print(Foo.__doc__)

五  python 推导式

lis = [x*x  for x in range(10)]
print(lis)
lis = [x*x  for x in range(10) if x %2 ==0 ]
print(lis)
lis = [a+b  for a in '123' for  b in 'abc']
print(lis)
dic={"k1":"v1","k2":"v2"}
a = [k+ ":" +v  for k,v in dic.items()]
print(a)
dic={i:i**3 for  i in range(5)}
print(dic)
s={i  for i in "abcdasd" if i not in "abc"}
print(s)
结果为集合

 六 简单的装饰器

def outer(func):
    def inner():
        print("认证成功")
        result = func()
        print("日志添加成功")
        return result
    return  inner


@outer
def f1():
    print("业务部门1")
    pass

f1()

  执行过程 

一:   到 @outer 这里 知道这是一个装饰器  把f1这个函数名!!!作为参数传递给outer  也就是 outer(f1)  注意这里 不执行函数  这里的outer函数有返回值 inner  这时候 inner就是指向 f1

二 :执行f1()  -->  这时候的f1 就是inner

print("认证成功")  -->  这时候的func 也就是原来的f1 -->print("业务部门1") -->   print("日志添加成功")

七 函数作用域 

a=1
def test(a):
        print("函数内部修改前a的地址是%s"%(id(a)))
        a=2
        print("函数内部修改后a的地址是%s"%(id(a)))

print("函数外部修改前a的地址是%s"%(id(a)))
test(3)
print("函数外部修改后a的地址是%s"%(id(a)))

 我们发现修改前后a的地址没用变化,说明 函数内部的 a 其实是独立的一个变量,赋值运算会再函数内部开辟一个新的变量空间

a=["1qwe"]
def test(a):
        print("函数内部修改前a的地址是%s"%(id(a)))
        a.append("www")
        print("函数内部修改后a的地址是%s"%(id(a)))

print("函数外部修改前a的地址是%s"%(id(a)))
test(a)
print("函数外部修改后a的地址是%s"%(id(a)))

 如果传递的是一个列表(可变的对象)  发现内部外部的对象是一样的

 

原文地址:https://www.cnblogs.com/ZFBG/p/11386141.html