python的__init__、__dict__以及類變量和對象變量的關係

1,__init__的顯示與隱式調用,見例子:python

#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__函數mysql

2,類和對象各維護一個字典__dict__,查詢的時候,先查詢對象,再查對象,最後查超類,因此,對象能夠調用類的變量,可是類不能調用對象的變量。見下面的例子:sql

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

#要解決以上問題,首先得清晰什麼時候類纔有了類變量,實例有了實例變量?
#其次要深刻理解類變量的做用,實例變量存在的範圍和誰相關!數據庫

相關文章
相關標籤/搜索