Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
錄:
面向對象編程,類的定義,類的屬性,類方法,__init__ 初始化魔法方法
面向對象(object-oriented ;簡稱: OO) 至今還沒有統一的概念 我這里把它定義為: 按人們 認識客觀世界的系統思維方式,采用基于對象(實體) 的概念建立模型,模擬客觀世界分析、設計、實現軟件的辦法。
# **程序是由數據和功能組合而成的對象構建起來的**
面向對象編程(Object Oriented Programming-OOP) 是一種解決軟件復用的設計和編程方法。 這種方法把軟件系統中相近相似的操作邏輯和操作應用數據、狀態,以類的型式描述出來,
# 以對象實例的形式在軟件系統中復用,以達到提高軟件開發效率的作用。
面向過程:根據業務邏輯從上到下寫代碼,
面向對象:對數據與函數綁定到一起,進行封裝,這樣能夠更快速的開發程序,減少了重復代碼的重寫過程
- 面向對象和面向過程都是解決問題的一種思路而已
- 當遇到一個需求的時候不用自己去實現,如果自己一步步實現那就是面向過程
- 應該找一個專門做這個事的人來做
- 面向對象是基于面向過程的
如何將面對對象帶入到編程中去?----通過class 類
類是對象的抽象化,類是一群具有相同特征或行為的事物的統稱。(如人類)
class 類名():
pass
駝峰命名法(首字母大寫)
只能是一個詞,不能有空格。
只能包含字母、數字、和下劃線。
不能以數字開頭。
不可以使用關鍵字(重名) 例如int,class
取名盡量有意義---見名思意
class Person():
pass
# 調用:類的實例化
wum = Person() # wum是Person類的一個實例對象
mar = Person() # 同上
類可以看作是獨立存放【屬性及方法】的空間。
類就像人擁有其獨特的特性(屬性)以及行動(方法)
類是一個事物的抽象,不是真實存在的,描繪了事物的共性
實例:某類事物的具體個體,是該類事物的具體表現,真實存在
實例是存放變量的空間,不同實例之間互不可見,即互不影響
***實例對象可以獲得類中所有的屬性及方法***
在查找屬性時,會優先在實例中查找,然后在類中查找
dir()查看類的內置屬性
共有屬性前沒有下劃線,實例可以直接訪問,也可以修改
共有屬性----可直接訪問、修改
屬性前加'_'一個下劃線,外部可以直接訪問
屬性前加'__'兩個下劃線,外部不可以直接訪問,因為訪問名稱改變了,可以通過dir()查看
私有屬性可以更好的保存屬性安全,即不能隨意修改
# 私有屬性是一種規范,并非限制,因此可以通過特定的方法訪問私有屬性
# 定義在類中的私有屬性也可以被子類(實例對象)繼承
屬性前加'__'兩個下劃線,外部不可以直接訪問
_ 和 __這是一種規范(約定), 沒有真正的限制作用,因此仍可以訪問前面有兩條下劃線的私有屬性。
訪問兩條下劃線的私有屬性的方法:_類名+__私有屬性名(例如:_Person__age)
訪問兩條下劃線的私有屬性的方法:_類名+__私有屬性名
class Person():
name = '小明'
xiaoming = Person()
xiaoming.age = 18 #給xiaoming這個實例對象添加age屬性,而Person類是沒有age這個屬性的
print(xiaoming.age)
18
類方法就是針對 類對象定義的方法;如果類是人類,那么類方法可以理解為是人類的行動
self代表實例對象本身
方法總是定義在類中,但是卻叫實例方法,因為它表示該類所有實例共有的行為
class Person():
def 方法名(self): #定義類方法一定要在類中,因此要注意左邊縮進
pass
通過實例對象調用
常規調用方法
在方法中調用屬性
在方法中調用其他方法
定義和用途
#定義:
所謂魔法方法,就是在特定條件下,自動觸發方法。
__init__魔法方法則是在實例化后自動調用,以完成實例初始化。
#用途:
該函數可用于解決:每一個實例化對象需要不同的屬性
**初始化的定義必須在類的開頭**
__init__ 初始化魔法方法
在初始化定義時:
1.多個屬性的值可以在實例對象調用時傳入
2.可以固定屬性的值
3.可以修改固定屬性的值
#定義類
class Person():
def __init__(self,num,name):
self.age = num
self.gender = '男'
#固定屬性的值,即所有實例對象都有gender屬性值('男'),若要修改可以在實例對象調用時直接改
self.name = name
#調用實例
xiaoming = Person(8,'小明')
print(xiaoming.age)
print(xiaoming.name)
print(xiaoming.gender)
h = Person(50,'h')
print(h.gender)
xiaohua = Person(18,'小花')
xiaohua.gender = '女' #將xiaohua這個實例對象的gender從 '男' 改成 '女'
print(xiaohua.gender)
8
小明
男
男 -------h.gender
女--------xiaohua.gender
私有屬性調用方式:
1.調用私有屬性方式:_類名__屬性名
2.在方法中調用私有屬性,在外部調用時可以直接調取
3.可以定義一個方法,專門返回私有屬性,這樣在外部調用該方法時,可以直接調用私有屬性
4.可以定義一個方法,專門返回改變后的屬性,再用返回私有屬性方法,打印改變后的屬性
5.最后返回的結果和定義時的函數順序無關,和調用實例對象時的代碼順序有關
class Person():
def __init__(self,name):
self.__name = name #__name是私有屬性
def eat(self):
print(f'{self.__name}吃飯')
#在方法中調用私有屬性,在外部可以直接調用該方法獲得私有屬性
def to(self): #查找返回私有屬性
return self.__name
def set_name(self,newname): #修改私有屬性
self.__name = newname
xiaoming = Person('小明')
xiaoming.eat() #調用eat方法,可以直接調用私有屬性name
print(xiaoming.to()) #查找修改前的私有屬性name
xiaoming.set_name('hhh') #調用set_name方法,修改私有屬性name的值為'hhh'
print(xiaoming.to()) #查找修改后的私有屬性name
#最后返回的結果和定義時的函數順序無關,和調用實例對象的代碼順序有關,
因此雖然在定義方法時,to查找方法在set_name修改方法之前,但是他們的定義順序和最后輸出的
結果無關,只要在調用方法時注意他們的先后順序就能輸出想要的結果(修改前或修改后的私有屬性)
小明吃飯
小明 ----修改前的私有屬性
hhh ----修改后的私有屬性
今天小編教大家如何用Python編程語言創建Web游戲,如果你能完成,你就可以算是一個能力相當不錯的Python初學者了。雖然還需要多讀一些書,多寫一些程序,不過你已經具備進一步學習的功底了。接下來的學習就只是時間、動力及資源的問題了。
在這個習題中,我們不會去創建一個完整的游戲,相反,我們會為習題42中的游戲創建一個“引擎”(engine),讓這個游戲能夠在瀏覽器中運行起來。這會涉及重構習題42中的游戲,混合習題47中的結構,添加自動測試代碼,最后創建一個可以運行這個游戲的Web引擎。
這是一個很龐大的習題。預計你要花一周到一個月才能完成。最好的方法是一點一點來,每晚完成一點,在進行下一步之前確認上一步已經正確完成。
你已經在兩個習題中修改了gothonweb項目,這個習題中會再修改一次。你學習的這種修改的技術叫做“重構”,或者用我喜歡的講法來說,叫“修理”。重構是一個編程術語,它指的是清理舊代碼或者為舊代碼添加新功能的過程。你其實已經做過這樣的事情了,只不過不知道這個術語而已。重構是軟件開發中經歷的最習以為常的事情。
在這個習題中你要做的是將習題47中的可以測試的房間地圖和習題43中的游戲這兩樣東西合并到一起,創建一個新的游戲結構。游戲的內容不會發生變化,只不過我們會通過“重構”讓它有一個更好的結構而已。
第一步是將ex47/game.py的內容復制到gothonweb/map.py中,然后將tests/ex47_tests.py的內容復制到tests/map_tests.py中,然后再次運行nosetests,確認它們還能正常工作。
注意
從現在開始,我不會再展示運行測試的輸出了,我假設你會回去運行這些測試,而且知道什么樣的輸出是正確的。
將習題47的代碼復制完畢后,就該開始重構它,讓它包含習題43中的地圖。我一開始會把基本結構為你準備好,然后你需要去完成map.py和map_tests.py里邊的內容。
首先要做的是用Room這個類來構建地圖的基本結構。
map.py
1 class Room(object):
2
3 def __init__(self, name, description):
4 self.name = name
5 self.description = description
6 self.paths = []
7
8 def go(self, direction):
9 return self.paths.get(direction, None)
10
11 def add_paths(self, paths):
12 self.paths.update(paths)
13
14
15 central_corridor = Room("Central Corridor",
16 """
17 The Gothons of Planet Percal #25 have invaded your ship and destroyed
18 your entire crew. You are the last surviving member and your last
19 mission is to get the neutron destruct bomb from the Weapons Armory,
20 put it in the bridge, and blow the ship up after getting into an
21 escape pod.
22
23 You're running down the central corridor to the Weapons Armory when
24 a Gothon jumps out, red scaly skin, dark grimy teeth, and evil clown costume
25 flowing around his hate filled body. He's blocking the door to the
26 Armory and about to pull a weapon to blast you.
27 """)
28
29
30 laser_weapon_armory = Room("Laser Weapon Armory",
31 """
32 Lucky for you they made you learn Gothon insults in the academy.
33 You tell the one Gothon joke you know:
34 Lbhe zbgure vf fb sng, jura fur fvgf nebhaq gur ubhfr, fur fvgf nebhaq gur ubhfr.
35 The Gothon stops, tries not to laugh, then busts out laughing and can't move.
36 While he's laughing you run up and shoot him square in the head
37 putting him down, then jump through the Weapon Armory door.
38
39 You do a dive roll into the Weapon Armory, crouch and scan the room
40 for more Gothons that might be hiding. It's dead quiet, too quiet.
41 You stand up and run to the far side of the room and find the
42 neutron bomb in its container. There's a keypad lock on the box
43 and you need the code to get the bomb out. If you get the code
44 wrong 10 times then the lock closes forever and you can't
45 get the bomb. The code is 3 digits.
46 """)
47
48
49 the_bridge = Room("The Bridge",
50 """
51 The container clicks open and the seal breaks, letting gas out.
52 You grab the neutron bomb and run as fast as you can to the
53 bridge where you must place it in the right spot.
54
55 You burst onto the Bridge with the netron destruct bomb
56 under your arm and surprise 5 Gothons who are trying to
57 take control of the ship. Each of them has an even uglier
58 clown costume than the last. They haven't pulled their
59 weapons out yet, as they see the active bomb under your
60 arm and don't want to set it off.
61 """)
62
63
64 escape_pod = Room("Escape Pod",
65 """
66 You point your blaster at the bomb under your arm
67 and the Gothons put their hands up and start to sweat.
68 You inch backward to the door, open it, and then carefully
69 place the bomb on the floor, pointing your blaster at it.
70 You then jump back through the door, punch the close button
71 and blast the lock so the Gothons can't get out.
72 Now that the bomb is placed you run to the escape pod to
73 get off this tin can.
74
75 You rush through the ship desperately trying to make it to
76 the escape pod before the whole ship explodes. It seems like
77 hardly any Gothons are on the ship, so your run is clear of
78 interference. You get to the chamber with the escape pods, and
79 now need to pick one to take. Some of them could be damaged
80 but you don't have time to look. There's 5 pods, which one
81 do you take?
82 """)
83
84
85 the_end_winner = Room("The End",
86 """
87 You jump into pod 2 and hit the eject button.
88 The pod easily slides out into space heading to
89 the planet below. As it flies to the planet, you look
90 back and see your ship implode then explode like a
91 bright star, taking out the Gothon ship at the same
92 time. You won!
93 """)
94
95
96 the_end_loser = Room("The End",
97 """
98 You jump into a random pod and hit the eject button.
99 The pod escapes out into the void of space, then
100 implodes as the hull ruptures, crushing your body
101 into jam jelly.
102 """
103 )
104
105 escape_pod.add_paths({
106 '2': the_end_winner,
107 '*': the_end_loser
108 })
109
110 generic_death = Room("death", "You died.")
111
112 the_bridge.add_paths({
113 'throw the bomb': generic_death,
114 'slowly place the bomb': escape_pod
115 })
116
117 laser_weapon_armory.add_paths({
118 '0132': the_bridge,
119 '*': generic_death
120 })
121
122 central_corridor.add_paths({
123 'shoot!': generic_death,
124 'dodge!': generic_death,
125 'tell a joke': laser_weapon_armory
126 })
127
128 START = central_corridor
你會發現Room類和地圖有一些問題。
1.我們必須把以前放在if-else結構中的房間描述做成每個房間的一部分。這樣房間的次序就不會被打亂了,這對我們的游戲是一件好事。這是你后面要修改的東西。
2.原版游戲中我們使用了專門的代碼來生成一些內容,如炸彈的激活鍵碼、艦艙的選擇等,這次我們做游戲時就先使用默認值好了,不過后面的附加練習里,我會要求你把這些功能再加到游戲中。
3.我為游戲中所有錯誤決策的失敗結尾寫了一個generic_death,你需要去補全這個函數。你需要把原版游戲中所有的場景結局都加進去,并確保代碼能正確運行。
4.我添加了一種新的轉換模式,以"*"為標記,用來在游戲引擎中實現“捕獲所有操作”的功能。
等把上面的代碼基本寫好以后,接下來就是你必須繼續寫的自動測試tests/map_test.py了。
map_tests.py
1 from nose.tools import *
2 from gothonweb.map import *
3
4 def test_room():
5 gold = Room("GoldRoom",
6 """This room has gold in it you can grab. There's a
7 door to the north.""")
8 assert_equal(gold.name, "GoldRoom")
9 assert_equal(gold.paths, {})
10
11 def test_room_paths():
12 center = Room("Center", "Test room in the center.")
13 north = Room("North", "Test room in the north.")
14 south = Room("South", "Test room in the south.")
15
16 center.add_paths({'north': north, 'south': south})
17 assert_equal(center.go('north'), north)
18 assert_equal(center.go('south'), south)
19
20 def test_map():
21 start = Room("Start", "You can go west and down a hole.")
22 west = Room("Trees", "There are trees here, you can go east.")
23 down = Room("Dungeon", "It's dark down here, you can go up.")
24
25 start.add_paths({'west': west, 'down': down})
26 west.add_paths({'east': start})
27 down.add_paths({'up': start})
28
29 assert_equal(start.go('west'), west)
30 assert_equal(start.go('west').go('east'), start)
31 assert_equal(start.go('down').go('up'), start)
32
33 def test_gothon_game_map():
34 assert_equal(START.go('shoot!'), generic_death)
35 assert_equal(START.go('dodge!'), generic_death)
36
37 room = START.go('tell a joke')
38 assert_equal(room, laser_weapon_armory)
你在這個習題中的任務是完成地圖,并且讓自動測試可以完整地檢查整個地圖。這包括將所有的generic_death對象修正為游戲中實際的失敗結尾。讓你的代碼成功運行起來,并讓你的測試越全面越好。后面我們會對地圖做一些修改,到時候這些測試將用來確保修改后的代碼還可以正常工作。
在Web應用程序運行的某個位置,你需要追蹤一些信息,并將這些信息和用戶的瀏覽器關聯起來。在HTTP協議的框架中,Web環境是“無狀態”的,這意味著你的每一次請求和你的其他請求都是相互獨立的。如果你請求了頁面A,輸入了一些數據,然后點了一個頁面B的鏈接,那你發送給頁面A的數據就全部消失了。
解決這個問題的方法是為Web應用程序建立一個很小的數據存儲,給每個瀏覽器進程賦予一個獨一無二的數字,用來跟蹤瀏覽器所做的事情。這個存儲通常用數據庫或者存儲在磁盤上的文件來實現。在lpthw.web這個小框架中實現這樣的功能是很容易的,下面就是一個這樣的例子。
session.sample.py
1 import web
2
3 web.config.debug = False
4
5 urls = (
6 "/count", "count",
7 "/reset", "reset"
8 )
9 app = web.application(urls, locals())
10 store = web.session.DiskStore('sessions')
11 session = web.session.Session(app, store, initializer=['count': 0])
12
13 class count:
14 def GET(self):
15 session.count += 1
16 return str(session.count)
17
18 class reset:
19 def GET(self):
20 session.kill()
21 return ""
22
23 if __name__ == "__main__":
24 app.run()
為了實現這個功能,需要創建一個sessions/文件夾作為程序的會話存儲位置,創建好以后運行這個程序,然后檢查/count頁面,刷新一下這個頁面,看計數會不會累加上去。關掉瀏覽器后,程序就會“忘掉”之前的位置,這也是我們的游戲所需的功能。有一種方法可以讓瀏覽器永遠記住一些信息,不過這會讓測試和開發變得更難。如果你回到/reset頁面,然后再訪問/count頁面,你可以看到你的計數器被重置了,因為你已經關掉了這個會話。
你需要花點時間弄懂這段代碼,注意會話開始時count的值是如何設為0的,另外再看看sessions/下面的文件,看能不能打開。下面是我打開一個Python會話并解碼的過程:
>>> import pickle
>>> import base64
>>> base64.b64decode(open("sessions/XXXXX").read())
"(dp1\nS'count'\np2\nI1\nsS'ip'\np3\nV127.0.0.1\np4\nsS'session_id'\np5\nS'XXXX'\np6\ns."
>>>
>>> x = base64.b64decode(open("sessions/XXXXX").read())
>>>
>>> pickle.loads(x)
{'count': 1, 'ip': u'127.0.0.1', 'session_id': 'XXXXX'}
所以,會話其實就是使用pickle和base64這些庫寫到磁盤上的字典。存儲和管理會話的方法很多,大概和Python的Web框架那么多,所以了解它們的工作原理并不是很重要。當然如果你需要調試或者清空會話,知道點兒原理還是有用的。
你應該已經寫好了游戲地圖和它的單元測試代碼。現在要你制作一個簡單的游戲引擎,用來讓游戲中的各個房間運轉起來,從玩家收集輸入,并且記住玩家所在的位置。我們將用到你剛學過的會話來制作一個簡單的引擎,讓它可以:
1.為新用戶啟動新的游戲;
2.將房間展示給用戶;
3.接收用戶的輸入;
4.在游戲中處理用戶的輸入;
5.顯示游戲的結果,繼續游戲,直到玩家角色死亡為止。
為了創建這個引擎,你需要將bin/app.py搬過來,創建一個功能完備的、基于會話的游戲引擎。這里的難點是,我會先使用基本的HTML文件創建一個非常簡單的版本,接下來將由你完成它。基本的引擎是下面這個樣子的:
app.py
1 import web
2 from gothonweb import map
3
4 urls = (
5 '/game', 'GameEngine',
6 '/', 'Index',
7 )
8
9 app = web.application(urls, globals())
10
11 # little hack so that debug mode works with sessions
12 if web.config.get('_session') is None:
13 store = web.session.DiskStore('sessions')
14 session = web.session.Session(app, store,
15 initializer=['room': None])
16 web.config._session = session
17 else:
18 session = web.config._session
19
20 render = web.template.render('templates/', base="layout")
21
22
23 class Index(object):
24 def GET(self):
25 # this is used to "setup" the session with starting values
26 session.room = map.START
27 web.seeother("/game")
28
29
30 class GameEngine(object):
31
32 def GET(self):
33 if session.room:
34 return render.show_room(room=session.room)
35 else:
36 # why is there here? do you need it?
37 return render.you_died()
38
39 def POST(self):
40 form = web.input(action=None)
41
42 # there is a bug here, can you fix it?
43 if session.room and form.action:
44 session.room = session.room.go(form.action)
45
46 web.seeother("/game")
47
48 if __name__ == "__main__":
49 app.run()
在這個腳本里你可以看到更多的新東西,不過了不起的事情是,整個基于網頁的游戲引擎只要一個小文件就可以做到了。這段腳本里最有技術含量的就是將會話帶回來的那幾行,這對于調試模式下的代碼重載是必需的,否則每次刷新網頁,會話就會消失,游戲也不會再繼續了。
在運行bin/app.py之前,你需要修改PYTHONPATH環境變量。不知道什么是環境變量?要運行一個最基本的Python程序,你就得學會環境變量,用Python的人就喜歡這樣:
在終端輸入下面的內容:
export PYTHONPATH=$PYTHONPATH:.
如果用的是Windows,那就在PowerShell中輸入以下內容:
$env:PYTHONPATH = "$env:PYTHONPATH;."
你只要針對每一個shell會話輸入一次就可以了,不過如果你運行Python代碼時看到了導入錯誤,那就需要去執行一下上面的命令,或者是因為你上次執行的有錯才導致導入錯誤的。
接下來需要刪掉templates/hello_form.html和templates/index.html,然后重新創建上面代碼中提到的兩個模板。下面是一個非常簡單的templates/show_room.html,供你參考。
show_room.html
$def with (room)
<h1> $room.name </h1>
<pre>
$room.description
</pre>
$if room.name == "death":
<p><a href="/">Play Again?</a></p>
$else:
<p>
<form action="/game" method="POST">
- <input type="text" name="action"> <input type="SUBMIT">
</form>
</p>
這就用來顯示游戲中的房間的模板。接下來,你需要在用戶跑到地圖的邊界時,用一個模板告訴用戶,他的角色的死亡信息,也就是templates/you_died.html這個模板。
you_died.html
<h1>You Died!</h1>
<p>Looks like you bit the dust.</p>
<p><a href="/">Play Again</a></p>
準備好這些文件就可以做下面的事情了。
1.再次運行測試代碼tests/app_tests.py,這樣就可以測試這個游戲。由于會話的存在,你可能頂多只能實現幾次點擊,不過你應該可以做出一些基本的測試來。
2.刪除sessions/*下的文件,再重新運行一遍游戲,確認游戲是從一開始運行的。
3. 運行python bin/app.py腳本,試玩一下你的游戲。
你需要和往常一樣刷新和修正你的游戲,慢慢修改游戲的HTML文件和引擎,直到實現游戲需要的所有功能為止。
你有沒有覺得我一下子給了你超多的信息呢?那就對了,我想要你在學習技能的同時有一些可以用來鼓搗的東西。為了完成這個習題,我將給你最后一套需要你自己完成的練習。你會注意到,到目前為止你寫的游戲并不是很好,這只是你的第一版代碼而已,你現在的任務就是讓游戲更加完善,實現下面的這些功能。
1.修正代碼中所有我提到和沒提到的bug,如果你發現了新bug,你可以告訴我。
2.改進所有的自動測試,以便可以測試更多的內容,直到你可以不用瀏覽器就能測到所有的內容為止。
3.讓HTML頁面看上去更美觀一些。
4.研究一下網頁登錄系統,為這個程序創建一個登錄界面,這樣人們就可以登錄這個游戲,并且可以保存游戲高分。
5.完成游戲地圖,盡可能地把游戲做大,功能做全。
6.給用戶一個“幫助系統”,讓他們可以查詢每個房間里可以執行哪些命令。
7.為游戲添加新功能,想到什么功能就添加什么功能。
8.創建多個地圖,讓用戶可以選擇他們想要玩的一張地圖來進行游戲。你的bin/app.py應該可以運行提供給它的任意地圖,這樣你的引擎就可以支持多個不同的游戲。
9.最后,使用在習題48和習題49中學到的東西創建一個更好的輸入處理器。你手頭已經有了大部分必要的代碼,只需要改進語法,讓它和你的輸入表單以及游戲引擎掛鉤即可。
祝你好運!
你需要閱讀并了解帶reloader的會話:http://webpy.org/cookbook/session_with_reloader。
錯誤路徑,錯誤Python版本,PYTHONPATH沒設置對,漏了__init__.py文件,拼寫錯誤,都檢查一下吧。
頭條創作挑戰賽#
在Python中,class是一種用于創建對象的藍圖或模板。它定義了一組屬性和方法,用于描述對象的行為和狀態。通過定義一個class,您可以創建多個具有相同屬性和方法的對象。
以下是關于Python中的class的詳細講解:
定義一個class: 使用 class 關鍵字來定義一個class,并指定class的名稱。類名通常使用首字母大寫的駝峰命名法。
class MyClass:
# 類的定義
pass
實例化對象: 通過調用類來創建對象的過程稱為實例化。實例化一個類會調用類的 __init__ 方法,對對象進行初始化。
obj = MyClass() # 創建一個MyClass的對象 obj
構造方法: 構造方法( __init__ )是在實例化對象時自動調用的特殊方法。它用于初始化對象的屬性。
class MyClass:
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
實例屬性和方法: 類定義中定義的屬性和方法稱為實例屬性和實例方法。實例屬性是每個對象特有的屬性,可以通過 self 關鍵字來訪問。實例方法是與實例對象相關聯的函數,可以通過實例對象進行調用。
class MyClass:
def __init__(self, arg1):
self.arg1 = arg1
def instance_method(self):
print(self.arg1)
obj = MyClass("Hello")
obj.instance_method() # 輸出 "Hello"
類屬性和類方法: 類屬性是與類關聯的屬性,它們在所有實例之間共享。類屬性可以直接通過類名訪問。類方法是與類關聯的方法,而不是實例,它可以訪問類屬性并進行操作。
class MyClass:
class_attr = "Hello"
@classmethod
def class_method(cls):
print(cls.class_attr)
MyClass.class_method() # 輸出 "Hello"
繼承: 繼承是一種創建新類的方法,它通過繼承現有類的屬性和方法來擴展新類。子類繼承父類的所有屬性和方法,并可以添加新的屬性和方法。
class ParentClass:
def parent_method(self):
print("Parent method")
class ChildClass(ParentClass):
def child_method(self):
print("Child method")
obj = ChildClass()
obj.parent_method() # 輸出 "Parent method"
obj.child_method() # 輸出 "Child method"
封裝和訪問控制: Python中沒有嚴格的訪問控制機制,但可以通過約定來實現封裝。通常,私有屬性和方法會用一個下劃線開頭 _ 表示,表示它們應該被視為私有的,并且不應該在類的外部直接訪問。
class MyClass:
def __init__(self):
self._private_attr = "Private attribute"
def _private_method(self):
print("Private method")
def public_method(self):
print(self._private_attr)
self._private_method()
obj = MyClass()
obj.public_method() # 輸出 "Private attribute" 和 "Private method"
這些是Python中class的基本概念和用法。通過使用class,可以更好地組織代碼,提高代碼的可讀性和可維護性,使其更符合面向對象的編程范式。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。