您的位置:首页 > 编程语言 > Python开发

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

2017-01-06 00:00 477 查看
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': <sqlalchemy.orm.state.InstanceState object at 0x7f010c45a990>, '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.y

a = 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

#要解决以上问题,首先得清晰何时类才有了类变量,实例有了实例变量?
#其次要深入理解类变量的作用,实例变量存在的范围和谁相关!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: