1. 怎樣使用python 的「CLASS」
class就是類定義。就是把數據及其上的操作封裝的單元。支持面向對象的語言都有這個概念。比如c++,java之類的。下面是我隨手敲的例子:
IDLE 2.6.5 ==== No Subprocess ====
>>> class Point:
def __init__(self,x,y):
self.x=x
self.y=y
def getX(self):
return self.x
def getY(self):
return self.y
>>> p=Point(1,2)
>>> p
<__main__.Point instance at 0x97df54c>
>>> p.getX()
1
>>> p.getY()
2
>>>
2. 關於python里定義class的問題
它是python語法中固定的方法,主要作用就是創建類實例後做初始化工作,創建時調用__new__,初始化時調用__init__。這些方法叫做魔法方法,由python解釋器調用
3. python關於class問題 小白求解答
Python編程中類的概念可以比作是某種類型集合的描述,如「人類」可以被看作一個類,然後用人類這個類定義出每個具體的人——你、我、他等作為其對象。類還擁有屬性和功能,屬性即類本身的一些特性,如人類有名字、身高和體重等屬性,而具體值則會根據每個人的不同;功能則是類所能實現的行為,如人類擁有吃飯、走路和睡覺等功能。具體的形式如下:
#例:類的概念
class人類:
名字='未命名'#成員變數
def說話(內容):#成員函數
print內容#成員變數賦初始值
某人=人類()#定義一個人類對象某人
某人.名字="路人甲"
某人.說話('大家好')#路人甲說話
>>>大家好!#輸出
Python中定義和使用類的形式為:class 類名[(父類名)]:[成員函數及成員變數],類名為這個類的名稱,而父類名為可選,但定義父類名後,子類則擁有父類的相應屬性和方法。在用類定義成對象時,會先調用__init__構造函數,以初始化對象的各屬性,類的各屬性(成員變數)均可以在構造函數中定義,定義時只要加上對象指針就好了。而在對象銷毀時,則會調用__del__析構函數,定義類的成員函數時,必須默認一個變數(類似於C++中的this指針)代表類定義的對象本身,這個變數的名稱可自行定義,下面例子將使用 self變數表示類對象變數 。
#例:類定義及使用
classCAnimal:
name='unname'#成員變數
def__init__(self,voice='hello'):#重載構造函數
self.voice=voice#創建成員變數並賦初始值
def__del__(self):#重載析構函數
pass#空操作
defSay(self):
printself.voice
t=CAnimal()#定義動物對象t
t.Say()#t說話
>>hello#輸出
dog=CAnimal('wow')#定義動物對象dog
dog.Say()#dog說話
>>wow#輸出
4. python什麼時候需要用class舉例說明
def相當於每個組員,他們分別能完成一定的功能。
class相當於辦公室,他可以將旗下組員定義起來,方便調用。
在使用某些庫或者編寫大程序的時候,class是比較好用的,很簡單的程序自然用不上啦。
5. python 類裡面的class是什麼意思啊求
python這方面很靈活。其實java也一樣允許這樣子。你幾乎可以在任何情況下做任何事情。
通常class Meta可以放在外面。不過,這樣它就不能直接訪問父類的一些屬性了。
所以在python里class 如果放在另一個class 裡面,通常並不是為了隱藏這個class,並不是讓別人看不到它。而因為它需要父類里的一些屬性。需要共享。
另外直接在類里定義的一些變數,比如queryset,也是屬於類全局級的。只要引用了這個類,即使沒有初始化,這些變數也已經實例化。這個有些象是java里static的全局定義結果。
我們通常用這個方法來在不同的函數變數間共享 一部分數據。同時又不需要初始化一個實例並用指針指向這一部分數據。而是通過類名直接引用。
比如下面的一個用法
class Config:
pass
Config.user_name="xxx"
Config.password="yyyy"
這樣。只要你在當前模塊里,通過Config就可以引用到user_name和password,而不需要global這個修飾符。
6. python類的定義與使用是什麼
類Class:用來描述具體相同的屬性和方法的對象的集合。定義了該集合中每個對象所共有的屬性和方法。對象是類的示例。
類定義完成時(正常退出),就創建了一個 類對象。基本上它是對類定義創建的命名空間進行了一個包裝;我們在下一節進一步學習類對象的知識。原始的局部作用域(類定義引入之前生效的那個)得到恢復,類對象在這里綁定到類定義頭部的類名(例子中是 ClassName )。
基本語法
Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓代碼看起來整潔美觀。它不像其他的靜態語言如C、Pascal那樣需要重復書寫聲明語句,也不像它們的語法那樣經常有特殊情況和意外。
以上內容參考:網路-Python
7. python 類之間調用 class
python類的初始化函數是__init__,有兩個「_」,你只有1個,所以python認為你的ThirdClass沒有定義初始化函數,所以它就給你調用了默認的不接受參數的初始化函數,所以它才告訴你ThirdClass的不接受有參數的初始化。
8. python怎麼用class定義的類
這里有個二叉樹的例子
classTreeNode(object):
def__init__(self,data=0,left=0,right=0):
self.data=data
self.left=left
self.right=right
classBTree(object):
"""docstringforBTree"""
def__init__(self,root=0):
self.root=root
defis_empty(self):
ifself.rootis0:
returnTrue
else:
returnFalse
defpreOrder(self,treenode):
iftreenodeis0:
return
print(treenode.data,end=',')
self.preOrder(treenode.left)
self.preOrder(treenode.right)
definOrder(self,trennode):
iftrennodeis0:
return
self.inOrder(trennode.left)
print(trennode.data,end=',')
self.inOrder(trennode.right)
defpostOrder(self,treenode):
iftreenodeis0:
return
self.postOrder(treenode.left)
self.postOrder(treenode.right)
print(treenode.data,end=',')
defcount_BiTNode(self,treenode):
iftreenodeisNone:
return0
else:
return(1+self.count_BiTNode(treenode.left)+self.count_BiTNode(treenode.right))
n1=TreeNode(data=1)
n2=TreeNode(2,left=n1,right=0)
n3=TreeNode(3)
n4=TreeNode(4)
n5=TreeNode(5,n3,n4)
n6=TreeNode(6,n2,n5)
n7=TreeNode(7,n6,0)
n8=TreeNode(data=8)
root=TreeNode('root',n7,n8)
bt=BTree(root)
print("先序遍歷:")
print(bt.preOrder(bt.root))
print("中序遍歷:")
print(bt.inOrder(bt.root))
print("後序遍歷:")
print(bt.postOrder(bt.root))
print(bt.count_BiTNode(bt.root))
9. python裡面怎麼調用class
以下代碼調試通過:
classLuciaClass:#定義類
defluciaprint(self,text):#類裡面的方法
print(' ',text)#方法就是輸出text
x=LuciaClass()#方法的實例x
x.luciaprint('todayisabadday~~~')#實例調用類方法
運行效果:
10. 如何在Python中使用static,class,abstract方法
方法在Python中是如何工作的
方法就是一個函數,它作為一個類屬性而存在,你可以用如下方式來聲明、訪問一個函數:
Python
>>> class Pizza(object):
... def __init__(self, size):
... self.size = size
... def get_size(self):
... return self.size
...
>>> Pizza.get_size
<unbound method Pizza.get_size>
Python在告訴你,屬性_get_size是類Pizza的一個未綁定方法。這是什麼意思呢?很快我們就會知道答案:
Python
>>> Pizza.get_size()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: unbound method get_size() must be called with Pizza instance as first argument (got nothing instead)
我們不能這么調用,因為它還沒有綁定到Pizza類的任何實例上,它需要一個實例作為第一個參數傳遞進去(Python2必須是該類的實例,Python3中可以是任何東西),嘗試一下:
Python
>>> Pizza.get_size(Pizza(42))
42
>>> Pizza.get_size(Pizza(42))
42
太棒了,現在用一個實例作為它的的第一個參數來調用,整個世界都清靜了,如果我說這種調用方式還不是最方便的,你也會這么認為的;沒錯,現在每次調用這個方法的時候我們都不得不引用這個類,如果不知道哪個類是我們的對象,長期看來這種方式是行不通的。
那麼Python為我們做了什麼呢,它綁定了所有來自類_Pizza的方法以及該類的任何一個實例的方法。也就意味著現在屬性get_size是Pizza的一個實例對象的綁定方法,這個方法的第一個參數就是該實例本身。
Python
>>> Pizza(42).get_size
<bound method Pizza.get_size of <__main__.Pizza object at 0x7f3138827910>>
>>> Pizza(42).get_size()
42
和我們預期的一樣,現在不再需要提供任何參數給_get_size,因為它已經是綁定的,它的self參數會自動地設置給Pizza實例,下面代碼是最好的證明:
Python
>>> m = Pizza(42).get_size
>>> m()
42
更有甚者,你都沒必要使用持有Pizza對象的引用了,因為該方法已經綁定到了這個對象,所以這個方法對它自己來說是已經足夠了。
也許,如果你想知道這個綁定的方法是綁定在哪個對象上,下面這種手段就能得知:
Python
>>> m = Pizza(42).get_size
>>> m.__self__
<__main__.Pizza object at 0x7f3138827910>
>>> # You could guess, look at this:
...
>>> m == m.__self__.get_size
True
顯然,該對象仍然有一個引用存在,只要你願意你還是可以把它找回來。
在Python3中,依附在類上的函數不再當作是未綁定的方法,而是把它當作一個簡單地函數,如果有必要它會綁定到一個對象身上去,原則依然和Python2保持一致,但是模塊更簡潔:
Python
>>> class Pizza(object):
... def __init__(self, size):
... self.size = size
... def get_size(self):
... return self.size
...
>>> Pizza.get_size
<function Pizza.get_size at 0x7f307f984dd0>
靜態方法
靜態方法是一類特殊的方法,有時你可能需要寫一個屬於這個類的方法,但是這些代碼完全不會使用到實例對象本身,例如:
Python
class Pizza(object):
@staticmethod
def mix_ingredients(x, y):
return x + y
def cook(self):
return self.mix_ingredients(self.cheese, self.vegetables)
這個例子中,如果把_mix_ingredients作為非靜態方法同樣可以運行,但是它要提供self參數,而這個參數在方法中根本不會被使用到。這里的@staticmethod裝飾器可以給我們帶來一些好處:
Python不再需要為Pizza對象實例初始化一個綁定方法,綁定方法同樣是對象,但是創建他們需要成本,而靜態方法就可以避免這些。
Python
>>> Pizza().cook is Pizza().cook
False
>>> Pizza().mix_ingredients is Pizza.mix_ingredients
True
>>> Pizza().mix_ingredients is Pizza().mix_ingredients
True
可讀性更好的代碼,看到@staticmethod我們就知道這個方法並不需要依賴對象本身的狀態。
可以在子類中被覆蓋,如果是把mix_ingredients作為模塊的頂層函數,那麼繼承自Pizza的子類就沒法改變pizza的mix_ingredients了如果不覆蓋cook的話。
類方法
話雖如此,什麼是類方法呢?類方法不是綁定到對象上,而是綁定在類上的方法。
Python
>>> class Pizza(object):
... radius = 42
... @classmethod
... def get_radius(cls):
... return cls.radius
...
>>>
>>> Pizza.get_radius
<bound method type.get_radius of <class '__main__.Pizza'>>
>>> Pizza().get_radius
<bound method type.get_radius of <class '__main__.Pizza'>>
>>> Pizza.get_radius is Pizza().get_radius
True
>>> Pizza.get_radius()
42
無論你用哪種方式訪問這個方法,它總是綁定到了這個類身上,它的第一個參數是這個類本身(記住:類也是對象)。
什麼時候使用這種方法呢?類方法通常在以下兩種場景是非常有用的:
工廠方法:它用於創建類的實例,例如一些預處理。如果使用@staticmethod代替,那我們不得不硬編碼Pizza類名在函數中,這使得任何繼承Pizza的類都不能使用我們這個工廠方法給它自己用。
Python
class Pizza(object):
def __init__(self, ingredients):
self.ingredients = ingredients
@classmethod
def from_fridge(cls, fridge):
return cls(fridge.get_cheese() + fridge.get_vegetables())
調用靜態類:如果你把一個靜態方法拆分成多個靜態方法,除非你使用類方法,否則你還是得硬編碼類名。使用這種方式聲明方法,Pizza類名明永遠都不會在被直接引用,繼承和方法覆蓋都可以完美的工作。
Python
class Pizza(object):
def __init__(self, radius, height):
self.radius = radius
self.height = height
@staticmethod
def compute_area(radius):
return math.pi * (radius ** 2)
@classmethod
def compute_volume(cls, height, radius):
return height * cls.compute_area(radius)
def get_volume(self):
return self.compute_volume(self.height, self.radius)
抽象方法
抽象方法是定義在基類中的一種方法,它沒有提供任何實現,類似於Java中介面(Interface)裡面的方法。
在Python中實現抽象方法最簡單地方式是:
Python
class Pizza(object):
def get_radius(self):
raise NotImplementedError
任何繼承自_Pizza的類必須覆蓋實現方法get_radius,否則會拋出異常。
這種抽象方法的實現有它的弊端,如果你寫一個類繼承Pizza,但是忘記實現get_radius,異常只有在你真正使用的時候才會拋出來。
Python
>>> Pizza()
<__main__.Pizza object at 0x7fb747353d90>
>>> Pizza().get_radius()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
File "<stdin>", line 3, in get_radius
NotImplementedError
還有一種方式可以讓錯誤更早的觸發,使用Python提供的abc模塊,對象被初始化之後就可以拋出異常:
Python
import abc
class BasePizza(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def get_radius(self):
"""Method that should do something."""
使用abc後,當你嘗試初始化BasePizza或者任何子類的時候立馬就會得到一個TypeError,而無需等到真正調用get_radius的時候才發現異常。
Python
>>> BasePizza()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: Can't instantiate abstract class BasePizza with abstract methods get_radius
混合靜態方法、類方法、抽象方法
當你開始構建類和繼承結構時,混合使用這些裝飾器的時候到了,所以這里列出了一些技巧。
記住,聲明一個抽象的方法,不會固定方法的原型,這就意味著雖然你必須實現它,但是我可以用任何參數列表來實現:
Python
import abc
class BasePizza(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def get_ingredients(self):
"""Returns the ingredient list."""
class Calzone(BasePizza):
def get_ingredients(self, with_egg=False):
egg = Egg() if with_egg else None
return self.ingredients + egg
這樣是允許的,因為Calzone滿足BasePizza對象所定義的介面需求。同樣我們也可以用一個類方法或靜態方法來實現:
Python
import abc
class BasePizza(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def get_ingredients(self):
"""Returns the ingredient list."""
class DietPizza(BasePizza):
@staticmethod
def get_ingredients():
return None
這同樣是正確的,因為它遵循抽象類BasePizza設定的契約。事實上get_ingredients方法並不需要知道返回結果是什麼,結果是實現細節,不是契約條件。
因此,你不能強制抽象方法的實現是一個常規方法、或者是類方法還是靜態方法,也沒什麼可爭論的。從Python3開始(在Python2中不能如你期待的運行,見issue5867),在abstractmethod方法上面使用@staticmethod和@classmethod裝飾器成為可能。
Python
import abc
class BasePizza(object):
__metaclass__ = abc.ABCMeta
ingredient = ['cheese']
@classmethod
@abc.abstractmethod
def get_ingredients(cls):
"""Returns the ingredient list."""
return cls.ingredients
別誤會了,如果你認為它會強制子類作為一個類方法來實現get_ingredients那你就錯了,它僅僅表示你實現的get_ingredients在BasePizza中是一個類方法。
可以在抽象方法中做代碼的實現?沒錯,Python與Java介面中的方法相反,你可以在抽象方法編寫實現代碼通過super()來調用它。(譯註:在Java8中,介面也提供的默認方法,允許在介面中寫方法的實現)
Python
import abc
class BasePizza(object):
__metaclass__ = abc.ABCMeta
default_ingredients = ['cheese']
@classmethod
@abc.abstractmethod
def get_ingredients(cls):
"""Returns the ingredient list."""
return cls.default_ingredients
class DietPizza(BasePizza):
def get_ingredients(self):
return ['egg'] + super(DietPizza, self).get_ingredients()
這個例子中,你構建的每個pizza都通過繼承BasePizza的方式,你不得不覆蓋get_ingredients方法,但是能夠使用默認機制通過super()來獲取ingredient列表。