python訪問類變數
⑴ python 靜態方法可以訪問類方法嗎
Python的靜態方法和類成員方法都可以被類或實例訪問,兩者概念不容易理清,但還是有區別的:
1)靜態方法無需傳入self參數,類成員方法需傳入代表本類的cls參數;
2)從第1條,靜態方法是無法訪問實例變數的,而類成員方法也同樣無法訪問實例變數,但可以訪問類變數;
3)靜態方法有點像函數工具庫的作用,而類成員方法則更接近類似Java面向對象概念中的靜態方法。
實現靜態方法和類方法的兩種方式
一、在Python 2.3及之前,用staticmethod和classmethod類型對象包裝實現
例子如下(注意print里的說明):
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'
def staticmd():
print '靜態方法,無法訪問val1和val2'
smd = staticmethod(staticmd)
def classmd(cls):
print '類方法,類:' + str(cls) + ',val1:' + cls.val1 + ',無法訪問val2的值'
cmd = classmethod(classmd)
執行:
>>> mc = MyClass()
>>> mc.smd()
>>> mc.cmd()
>>> MyClass.smd()
>>> MyClass.cmd()
二、在Python 2.4及之後,用裝飾器(decorators)實現
裝飾器使用@操作符,例子如下:
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'
@staticmethod
def staticmd():
print '靜態方法,無法訪問val1和val2'
@classmethod
def classmd(cls):
print '類方法,類:' + str(cls) + ',val1:' + cls.val1 + ',無法訪問val2的值'
⑵ python中為什麼類的實例方法可以直接訪問全局變數
只要這個實例屬於這個類,就能訪問這個類的所有共享變數
⑶ python中一個類的方法中怎樣使用另一個類的方法中的一個變數
class a()
def bf(self,event)
name = 'bf'
# 這里的name是局部變數,不是class.a的變數, 當a.bf(event)執行完後就不存在了。
如果希望保持該回變答量的值在class.a中,:
class a(object):
name = ''
def bf(self, event):
a.name = 'bf'
class b(object):
def exe(self, event):
a.bf(event)
print a.name
⑷ python 類方法訪問不出self變數
第一個參數寫self是指定為實例方法不是類方法、類方法要用@classmethod裝飾,
self其實也可以用必帶名字代替的。
具體可以參考這篇文章
⑸ python 類變數和實例變數的區別
類變數定義在類的定義之後,實例變數則是以為self.開頭。例如:
class Foo(object):
val1= 'aa' #類變數
def __init__(self):
self.val2 = 'bb' #實例回變數
val3= 'cc' #順便設置的變答量不知道屬於什麼變數
print self.__class__.val1 #實例對象訪問類變數的另一種方法
實例對象可以訪問類變數和實例變數
但是類對象卻只能訪問類變數,在實例方法中的變數都不能訪問。
⑹ python的子類怎麼訪問父類的成員變數
首先當子類繼承了父類,因此子類(當繼承方式為public或protected時)可以訪問及改動父類的public成員,但訪問或改不了私有成員和不可訪問變數
⑺ python類的動態方法是否可以訪問到私有變數
classStudent(object):
def__init__(self,name,score):
self.__name=name;
self.__score=score;
self.__grade=3;##這是私有的屬性
self.grade=3;##這是公有的。
defshow_grade(self):
print("%s__grade=%d"%(self.__name,self.__grade));
print("%sgrade=%d"%(self.__name,self.grade));
lisa=Student("lisa",88);
mona=Student("mona",82);
defset_grade(self,grade):
self.__grade=grade;##實測發現,此函數調用後__grade還是原值。__grade是私有變數。只能被class里的「靜態方法」來修改。
self.grade=grade;##此函數調用後,grade的值被修改了。grade是公開變數。可以被動態方法來修改。
#print("%sgradeis%d"%(self.__name,self.grade));#在這里訪問不到self.__name,所以把此句注釋掉了。
Student.setGrade=set_grade;
lisa.setGrade(4);
lisa.show_grade();
結果如下:
lisa__grade=3
lisagrade=4
結論:
為類動態增加的方法,對類里私有屬性沒有讀與寫的許可權。
⑻ python 類方法中變數如何使用
data=gdal.Open(file_path)
改成 data=gdal.Open(self.file_path)
__init__會初始化實例, self.file_path = fl 是把 fl 的值賦到 實例裡面,你訪問 file_path,這個根本沒定義過,肯定報錯。
抽空補一下基礎吧,還是非常重要的。我現在也還在基礎中掙扎
⑼ python中如何在一個類中調用另一個類的method中的變數能實現嗎能否幫忙看下我的代碼,謝謝!
你這個代碼很有問題,
1. class Student:
def __init__(self):
for name in Name:
for id in ID:
self.name = name
self.id = id
最終Student得到的是實例有兩個變數name和id,他們的值分別是Kay和3,初始化時候的遍歷完全沒有意義。
2. self.lst.append("{} of {}".format(Student.__init__(self.id), Student.__init__(self.name)))
Student是一個類型,你都沒創建一個實例,__init__是實例的初始化函數,使用"__"修飾,是私有函數,不能在外部調用,然後那個裡面參數的self是Students的self肯定是訪問不到id和name的屬性的。
總的來說,代碼存在很多的問題。
想要獲得的結果是兩個列表中元素所有組合的可能性,可以這樣實現:
Name = ['Stella','Kay']
ID = [1,3]
result = [(a, b) for a in ID for b in Name]
這樣得到的result就是兩個列表的元素的組合
⑽ python如何在一個類中訪問另一個類的變數
1234def aaa(): s = 5 return sprint aaa()
或者:
12345def aaa(): global s s = 5aaa()print s
要在函數外部訪問函數的內部變數,要麼使用return將其返回到外部,要麼用回global定義為全局變數。推薦前答一種。
def只是定義函數,你還沒有調用和執行該函數。此外,要在控制台輸出,你可以在函數內部寫上print s+3 ,然後調用函數aaa()。
或者定義一個類:
1234class aaa: s = 5b = aaa #初始化一個類的實例print b.s #當然,你也可以直接使用aaa.s