質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

Python3のエラーobject has no attribute

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 781

score 11

 前提・実現したいこと

Python3で以下のプログラムを作成しましたがエラーがどうしても解決出来なくて困ってます。
改善方法をご提案していただきたく、質問させていただきます。

 発生したエラーメッセージ

line 502, in output_dailyrun
out['pF'] = ops.rootwater.pF
AttributeError: 'RootWater' object has no attribute 'pF'

 該当するソースコード

class RootWater(object):
    def __init__(self):
        """
        Create and initialize the RootWater object.

        """
        self.wc = 0.0           # water content (mm)
        self.vwc = 0.0          # water content (m3/m3)
        self.critical = 0.0     # water content, below which plant water stress occurs (m3/m3)
        self.sat = 0.0          # saturation point (m3/m3)
        self.fc = 0.0           # field capacity (m3/m3)
        self.pwp = 0.0          # permanent wilting point (m3/m3)
        self.pF = 0.0
#途中略してます
    def __init__(self, fname_in):
        """
        Create and initialize the SoilWater object.
        SoilWaterオブジェクトを創り、初期化

        # Arguments
            fname_in (str): path and filename of the model initialization file

        """
        Crop.__init__(self, fname_in)   # initialize the parent class first

        #初期設定一覧
        d = self.ini
        self.numintervals = d['numintervals']  # number of intervals for integration within a day(日毎の時間間隔の調整)
        self.rootdepth = d['rootdepth']  # rooting depth (m)
        self.has_watertable = d['has_watertable']     # has a water table / groundwater?
        self.numlayers = d['numlayers']  # the number of soil layers
        self.layers = [SoilLayer() for _ in range(self.numlayers)]  # create the soil layers

        # read in the properties for each soil layer. If there is a water table, the last soil
        #    layer is assumed to border the water table surface
        dl = d['layers']
        for i, layer in enumerate(self.layers):
            layer.thick = dl[i]['thick']  # thickness of each soil layer(各土層の厚さ) (m)
            layer.vwc = dl[i]['vwc']  # vol. water content(体積含水率) in m3/m3 //ここで出力(重要!!!)
            layer.wc = layer.vwc * layer.thick * 1000  # convert from m3/m3 to mm water(体積含水率を土壌水分量に変換)
            tex = dl[i]['texture']  # clay, sand, and OM percentages (%)
            layer.texture = Texture(tex['clay'], tex['sand'], tex['om'])

        # initialize the soil layers (those that do not change with water content)
        for i in range(self.numlayers):
            prevlayer = self.layers[i - 1] if i > 0 else None
            nextlayer = self.layers[i + 1] if i < self.numlayers - 1 else None
            self.layers[i].initialize_layer(prevlayer, nextlayer)

        # internal use: speedier calculations: proxy to store intermediate water flux values
        #    fluxes within a sub-interval daily time step
        self.__pf = [{f: 0.0 for f in SoilLayer.flux_fields} for _ in range(self.numlayers)]

        # cumulative fluxes at the end of a daily time step(1日の時間ステップの終了時における累積の流束)
        self.cf = [{f: 0.0 for f in SoilLayer.flux_fields} for _ in range(self.numlayers)]
        # root zone water characteristics(根域の特徴):
        self.rootwater = RootWater()
        self.update_rootwater()  # amount of water in the root zone (mm and m3/m3)
        # reduction to evaporation and transpiration due to water stress
        self.waterstresses = self.reduce_et()
        self.netrain = 0.0  # net rainfall (mm/day)
        self.aet = AET(0.0, 0.0)  # actual water loss by ET (mm/day)

    def net_rainfall(self):
        """
        Net rainfall (mm/day).
        有効雨量
        # Returns
            float: net rainfall

        """
        fraction = max(0.7295, 1 - 0.0541 * self.lai)  # net rain (mm) reaching soil depends on lai
        return fraction * self.dayrain

    def rooting_depth(self):
        """
        Increase in rooting depth (m).
        根長の増加
        # Returns
            float: rooting depth

        """
        # root growth rate = 2 mm/day but limited by water stress and total soil depth
        newdepth = self.rootdepth + (2.0 / 1000) * self.waterstresses.crop
        depthlimit = self.layers[-1].accthick
        return min(newdepth, depthlimit)

    def update_rootwater(self):
        """
        Update the water content and water characteristics in the rooting zone.

        The `RootZone` object will be set here.

        !!! note
            Critical soil water content for plant water stress taken as 0.6 or 60%
            of the difference between soil saturation and permanent wilting point.
            植物の水ストレスのための重要な土壌水分量は、0.6または60%は土壌水分量と永久しおれ店の間で取られます。
        # Returns
            None:

        """
        wc = wcsat = wcfc = wcpwp = 0.0
        # only consider those soil layers in where the roots reside:
        for layer in self.layers:
            diff = layer.thick - max(0.0, layer.accthick - self.rootdepth)
            if diff <= 0:
                break  # found all the soil layers holding the roots, so exit loop
            wc += layer.vwc * diff
            wcsat += layer.swc.sat * diff
            wcfc += layer.swc.fc * diff
            wcpwp += layer.swc.pwp * diff
        vwc = wc / self.rootdepth  # convert from m water to m3/m3


        #A,B,cはpFの実測値がないので仮の値を設定 追加10/9

        # A=5.0
        # B=0.8
        # c=0.4
        # thetas=0.8

        vwcsat = wcsat / self.rootdepth
        vwcfc = wcfc / self.rootdepth
        vwcpwp = wcpwp / self.rootdepth
        vwccr = vwcpwp + 0.6 * (vwcsat - vwcpwp)   # critical point
        # update the RootWater object with latest values:
        self.rootwater.wc = wc * 1000    # mm
        self.rootwater.vwc = vwc         # all the rest in m3/m3
        # self.rootwater.hoge = hoge           #追加10/9
        self.rootwater.critical = vwccr
        self.rootwater.sat = vwcsat
        self.rootwater.fc = vwcfc
        self.rootwater.pwp = vwcpwp

    def reduce_et(self):
        """
        #
        Reduction in evaporation and transpiration (0-1, 1=no stress, 0=max. stress).
        蒸発と蒸散の減少
        # Returns
            AET: `namedtuple` containing reduction in E and T (`float`)

        """
        #蒸発減少係数
        rde = 1 / (1 + (3.6073 * (self.layers[0].vwc / self.layers[0].swc.sat)) ** -9.3172)
        vwc = self.rootwater.vwc
        vwcpwp = self.rootwater.pwp
        vwccr = self.rootwater.critical
        if vwc >= vwccr:
            rdt = 1.0
        elif vwcpwp < vwc < vwccr:
            rdt = (vwc - vwcpwp) / (vwccr - vwcpwp)
        else:
            rdt = 0.01
        return AET(rdt, rde)

    def actual_et(self, petcrop, petsoil):
        """
        Actual evaporation and transpiration (mm/day).
        実際の蒸発と蒸散

        # Arguments
            petcrop (float): potential water loss from the crop (mm/day)
            petsoil (float): potential water loss from the soil (mm/day)

        # Returns
            AET: `namedtuple` containing actual water loss from soil and crop (`float`)

        """
        return AET(self.waterstresses.crop * petcrop*0.55, self.waterstresses.soil * petsoil*0.55)#収穫係数0.75をかける(9/14 0.55に変更)

    def influx_from_watertable(self):
        """
        Influx of water from the water table (m/day).

        # Returns
            float: groundwater influx

        """
        last = self.layers[-1]  # water table assumed just beneath the last soil layer(最後の土壌層直下の地下水面)
        k = (last.ksat - last.k) / (math.log(last.ksat) - math.log(last.k))
        hm = (33 - (33 - last.swc.airentry)) / 10.0   # saturated water table

        pF = math.log10(hm)

        self.rootwater.pF = pF

        hg = last.accthick

        tothead = hm + hg

        return k * (tothead - last.tothead) / (last.thick * 0.5)
#facade.py
    def output_dailyrun(self, initialize=False):
        out = self.out
        ops = self.model
        if not initialize:
            # 1. get results for daily properties:
            ag_growth = ops.parts.pinnae.growth + ops.parts.rachis.growth + ops.parts.trunk.growth
            veg_growth = ag_growth + ops.parts.roots.growth
            out['age'] = ops.treeage
            out['tmin'] = ops.daytmin
            out['tmax'] = ops.daytmax
            out['totalrad'], out['directrad'], out['diffuserad'] = ops.dayrad
            out['wind'] = ops.daywind
            out['rain'] = ops.dayrain
            out['netrain'] = ops.netrain
            out['ambientCO2'] = ops.co2ambient
            out['LAI'] = ops.lai
            out['pinnae'] = ops.parts.pinnae.weight
            out['rachis'] = ops.parts.rachis.weight
            out['trunk'] = ops.parts.trunk.weight
            out['roots'] = ops.parts.roots.weight
            out['male'] = ops.parts.maleflo.weight
            out['female'] = ops.parts.femaflo.weight
            out['bunches'] = ops.parts.bunches.weight
            out['flowersex'] = ops.flowersex
            out['VDM'] = ops.vdmwgt
            out['TDM'] = ops.tdmwgt
            out['assim_photosyn'] = ops.dayassim
            out['assim_maint'] = ops.assim4maint
            out['assim_growth'] = ops.assim4growth
            out['assim_gen'] = ops.assim4gen
            out['VDM_growth'] = ag_growth
            out['TDM_growth'] = veg_growth
            out['yield'] = ops.bunchyield
            out['trunk_hgt'] = ops.trunkhgt
            out['rootdepth'] = ops.rootdepth
            out['rootzone_VWC'] = ops.rootwater.vwc
            out['pF'] = ops.rootwater.pF


上記のソースコードのhmの値からpF値を求めたいと思ってますが、エラーが出て困っています。
ご指摘をお願いします。

 補足情報

Python3.6.1
Mas OS

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/10/26 13:36

    確認ですが、 def __init__(self):の__init__と def __init__(self, fname_in):はどちらもclass RootWater(object):に属しますか? であれば、tachikomaさんのアドバイス通りにする必要があります

    キャンセル

  • hayataka2049

    2018/10/26 13:37

    ops = self.modelを示されてもself.modelの正体がわからないのであまり意味がないのですが、、、

    キャンセル

  • mather

    2018/10/26 14:12

    tachikoma さんの助言どおりですね。もはや回答かと…。

    キャンセル

回答 1

0

コメントにあるとおりです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る