python的__init__、__dict__以及类变量和对象变量的关系

2017-01-07 10:40:01来源:oschina作者:dmwan人点击

1,__init__的显示与隐式调用,见例子:


#encoding=utf8
from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,scoped_session
engine = create_engine("mysql+mysqldb://root:Wan0926@127.0.0.1:3306/test1", max_overflow=5,encoding="utf8")
Base=declarative_base()
db_session=scoped_session(sessionmaker(bind=engine))
def create_all():
Base.metadata.create_all(bind=engine)#创建数据库def drop_all():
Base.metadata.drop_all(bind=engine)
class ceshi(Base):
__tablename__ = 'ceshi'
user_id = Column(Integer, primary_key=True)
ceshiid=Column(Integer)@classmethod
def new(cls,user_id,ceshiid):
"""
add new user
"""
user = ceshi(user_id,ceshiid)
db_session.add(user)
try:
db_session.commit()
except:
db_session.rollback()
db_session.close()
#create_all()#创建表
#
# ceshi.new(1,2)
# ceshi.new(2,3)
a=ceshi(user_id=1,ceshiid=2)#这是隐式构造__init__函数
print ceshi.__dict__
print a.__dict__#结果是{'ceshiid': 2, '_sa_instance_state': , 'user_id': 1}

未显示声明__init__的情况下,通过类实例化的字典赋值方式,可以隐式创建__init__函数


2,类和对象各维护一个字典__dict__,查询的时候,先查询对象,再查对象,最后查超类,所以,对象可以调用类的变量,但是类不能调用对象的变量。见下面的例子:


class aa: w = 10 def __init__(self): self.x = 11 self.y = 12 def add(self): return self.x + self.ya = aa() print a.add() #下边两条指令各起何作用?结果是输出两个 20 么?还是两个13?还是? aa.w = 20 a.w = 13 print aa.w, a.w #程序继续增加如下,怎样理解这t和q呢?他们是___变量 a.t = 14 a.q = 15 print a.t, a.q #程序继续增加如下,怎样理解这m和n呢?他们是___变量 aa.m = 30 aa.n = 40 print aa.m, aa.n#好了再来个提升吧 #程序继续增加,下列三个print语句都能正确执行么?为何? b = aa() print b.x,b.y print b.t,b.q print b.m,b.n#要解决以上问题,首先得清晰何时类才有了类变量,实例有了实例变量? #其次要深入理解类变量的作用,实例变量存在的范围和谁相关!

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台