propety/静态方法

问问题的方式
代码截下来,并且展示出错误行号,报错信息

博客

python js go swift c++
调试

mac快捷键的使用

mac pycharm 环境搭建

面试题汇总

生成器,协程

各种报错

各个数据结构的源码笔记

设计模式

题目理解: Checkio aosabook

默认文件的生成,快捷键的生成
TODO
hkjss.xyz 外网

markdown桌面端

昨日回顾

  1. 多态

  2. 封装
    私有成员特点:不能在类的外部被调用,只能在类的内部被调用
    再累的内部变形:_类名__名字

  3. @property 在函数执行之前或者之后还可以做其他的事情

  4. 私有机制如何实现

None is Object()

先有学生再有课程
管理员创建学生,课程才能选课 1234567
不区分老师,学生选择,而是放在同一个账号文件里
学生不能注册,
从管理员功能开始 >>创建学生账号>>创建课程

学生 查看课程 选择课程, 查看已选课程 老师评价,课程评价,提交作业 查看作业情况 删除作业(2次) 更改密码 有序的id 验证码
多线程课程人数 学生修学分 上课记录
老师 批改作业,查看课程,课程进度,查看学生某个课
课程 课时进度 课程时间 搜索课程详细信息,课程学分 判断两个课程时间是否冲突
没门课课程表
指定班级

lambda

for i in [lambda :x for x in range(10)]:
    print(i())
for i in (lambda :x for x in range(10)):
    print(i())
lambda表达式中的x是一个自由变量,
在运行时绑定值,而不是定义时就绑定,
这跟函数的默认值参数定义是不同的。
因此,在调用这个lambda表达式的时候,x的值是执行时的值。
如果你想让某个匿名函数在定义时就捕获到值,可以将那个参数值定义成默认参数即可
"这道题的根本问题不是在于列表推导和生成器表达式的差别"
"而是在探讨lambda表达式在定义时和运行时的差别"
"列表推导与生成器表达式只是间接的形成了定义时和运行时"
b = []
for i in (lambda :x for x in range(10)):
    b.append(i)
for j in b:
    print(j())
----------------
"输出"
9
9
9
9
9
9
9
9
9
9
----------------

"生成器表达式形成的时机"
"运行时(调用时)才会对x赋值"
"定义时并不会赋值"
b = []
for i in range(10):
    b.append(lambda :i)
    print(b[-1]())
----------------
"输出"
0
1
2
3
4
5
6
7
8
9
----------------
"列表推导形成的时机"
"运行时(调用时)才会对x赋值"
"定义时并不会赋值"
b = []
for i in range(10):
    b.append(lambda :i)
print("i:",i)
for j in b:
    print(j())
----------------
"输出"
i:9
9
9
9
9
9
9
9
9
9
9
----------------
b = []
a = "d"
c = "a——≈"
print("b:",b in globals())
print("a:",a in globals())
print("c:",c in globals())
----------
"输出"
TypeError: unhashable type: "list"
a: True
c: False
----------
  1. @property
  2. @classmethod
  3. @staticmethod
  4. 反射

property

只有当被property装饰的方法
又实现了一个同名的方法
且被setter装饰器装饰了
且在对被装饰的方法赋值的时候就出发被setter装饰器装饰的方法

property的意义
在某些情况下为了保证对象安全,可以在其中做些操作。
用来保护一个变量,在修改的时候能够添加一些保护条件
或者对数据进行逻辑上的额外操作。

class Goods:
  __discount = 0.7
  def __init__(self,price):
      self.__price = price
  @property
  def price(self):
    return self.__price * Goods.__discout
  @price.setter
  def price(self,new):
    self.__price = new
apple = Goods(10)
print(apple.price)
apple.price = 8
print(apple.price)

是否可以删除property伪装的属性?
不可以,需要property实现deleter,并且需要自己实现删除对象的属性

一个方法被伪装成属性之后应该可以执行一个属性的增删改查操作
setter 增加和修改 有必传的参数,表示赋值的时候等号后边的值
deleter
getter

类方法的特点

只使用类中的资源,且这个资源可以直接用类名引用的使用,那这个方法应该被改为一个类方法
静态属性,普通方法,类方法,property方法

static方法的特点

有没有既没有用对象属性,也没有类属性的方法?

class Student:
  @statcimethod
  def login():
      print("IN LOGIN")
Student.login("user","pwd") # 使用类调用

类:

所有的方法,所有的属性都可以设置成私有的

  静态属性    类  所有的对象都统一拥有的属性
  方法       对象  默认参数self 表示对象
  特性  property方法   对象  默认参数 self表示对象
  类方法      类  如果这个方法涉及到操作静态属性,类方法,静态方法  cls表示类
  静态方法    类 普通方法不使用,类中的命名空间,也不使用对象的命名空间,一个普通函数。在什么时候用?公司如果强制要求面向对象编程!没有默认参数

isinstance

检测对象类中间的关系

print(type(123) is int) 不接受继承关系
print(isinstance(123,int)) 接受继承关系
class A:
  pass
class B(A):
  pass
a = A()
b = B()
print(type(a) is A)
print(type(b) is A)
print(isinstance(a,A))
print(isinstance(b,A))

issubclass

class A:
  pass
class B(A):
  pass
print(issubclass(A,B)) 通过type(a) 然后通过issubclass(type(a),B)查看是不是实例
print(issubclass(B,A))

内联回调

def apply_async(func,args,*,callback):
    result = func(*args)
    callback(result)
from queue import Queue
from functools import wraps
class Async:
    def __init__(self,func,args):
        self.func = func
        self.args = args
def inlined_async(func):
    @wraps(func)
    def wrapper(*args):
        f = func(*args)
        result_queue = Queue()
        result_queue.put(None)
        while True:
            result = result_queue.get()
            try:
                a = f.send(result)
                apply_async(a.func,a.args,callback=result_queue.put)
            except StopIteration:
                break
    return wrapper
def add(x,y):
    return x + y
@inlined_async
def test():
    r = yield Async(add,(2,3))
    print(r)
    r = yield Async(add,("hello"))
test()

当前文件名

print(sys._getframe().f_code.co_filename)

当前函数名

print(sys._getframe(0).f_code.co_name)

当前行号

print sys._getframe().f_lineno 

获取某行的内容

import linecache
theline = linecache.getline(sys._getframe().f_code.co_filename,15)
print(theline)
posted @ 2018-09-03 17:34  寓清于浊  阅读(409)  评论(0编辑  收藏  举报