一 实例变量与类变量
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)))
如果传递的是一个列表(可变的对象) 发现内部外部的对象是一样的