繼續(xù)面向?qū)ο缶幊痰膶W(xué)習(xí)
classes(類)
class Person:
pass #An empty block
p=Person()
print(p)
Outport:
<main.Person object at 0x00000203E858F8D0>
這是類的一個(gè)最簡單的例子。說明main 模塊中有了一個(gè)Person 類的實(shí)例昔驱,“0x00000203E858F8D0”是對(duì)象在計(jì)算機(jī)內(nèi)存的地址。
Methods(方法)
類的方法和函數(shù)類似过咬,區(qū)別只是一個(gè)額外的self變量嗤栓。
class Fans:
def sayHi(self):
print("I'm a basketball fan. I like Jordan.")
bf=Fans()
bf.sayHi()
Outport:
I'm a basketball fan. I like Jordan.
注意sayHi 方法沒有任何參數(shù)蚓哩,但仍然在函數(shù)定義時(shí)有self。
The __ init __ Method(__init __方法)
Python 的類中有很多方法的名字有特殊的重要意義癞埠。init 方法在類的一個(gè)對(duì)象被建立時(shí)馬上運(yùn)行鸽粉。這個(gè)方法可以用來對(duì)你的對(duì)象做一些你希望的初始化斜脂。注意,這個(gè)名稱的開始和結(jié)尾都是雙下劃線触机。
class Person:
def __init__(self,name):
self.name=name
def say_hi(self):
print("I'm a basketball fun, I like ",self.name)
#p=Person('Mike Jordan')
#p.say_hi()
p=Person('Mike Jordan').say_hi()
Output
I'm a basketball fun, I like Mike Jordan
Class And Object Variables(類和對(duì)象變量)
有兩種類型的域—— 類的變量和對(duì)象的變量帚戳,它們根據(jù)是類還是對(duì)象擁有這個(gè)變量而區(qū)分。
類的變量由一個(gè)類的所有對(duì)象(實(shí)例)共享使用儡首。只有一個(gè)類變量的拷貝片任,所以當(dāng)某個(gè)對(duì)象對(duì)類的變量做了改動(dòng)的時(shí)候,這個(gè)改動(dòng)會(huì)反映到所有其他的實(shí)例上蔬胯。
對(duì)象的變量由類的每個(gè)對(duì)象/實(shí)例擁有对供。因此每個(gè)對(duì)象有自己對(duì)這個(gè)域的一份拷貝,即它們不是共享的氛濒,在同一個(gè)類的不同實(shí)例中产场,雖然對(duì)象的變量有相同的名稱,但是是互不相關(guān)的舞竿。
class Robot:
"""Represents a robot, with a name."""
# A class variable, counting the number of robots
population = 0
def __init__(self, name):
"""Initializes the data."""
self.name = name
print("(Initializing {})".format(self.name))
# When this person is created, the robot
# adds to the population
Robot.population += 1
def die(self):
"""I am dying."""
print("{} is being destroyed!".format(self.name))
Robot.population -= 1
if Robot.population == 0:
print("{} was the last one.".format(self.name))
else:
print("There are still {:d} robots working.".format(
Robot.population))
def say_hi(self):
"""Greeting by the robot.
Yeah, they can do that."""
print("Greetings, my masters call me {}.".format(self.name))
@classmethod
def how_many(cls):
"""Prints the current population."""
print("We have {:d} robots.".format(cls.population))
droid1 = Robot("R2-D2")
droid1.say_hi()
Robot.how_many()
droid2 = Robot("C-3PO")
droid2.say_hi()
Robot.how_many()
print("\nRobots can do some work here.\n")
print("Robots have finished their work. So let's destroy them.")
droid1.die()
droid2.die()
Robot.how_many()
Outport:
(Initializing R2-D2)
Greetings, my masters call me R2-D2.
We have 1 robots.
(Initializing C-3PO)
Greetings, my masters call me C-3PO.
We have 2 robots.Robots can do some work here.
Robots have finished their work. So let's destroy them.
R2-D2 is being destroyed!
There are still 1 robots working.
C-3PO is being destroyed!
C-3PO was the last one.
We have 0 robots.
Inheritance(繼承)
面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重用京景,途徑之一是通過繼承機(jī)制。繼承完全可以理解成執(zhí)行類之間的類型和子類型關(guān)系骗奖。
假設(shè)你想要寫一個(gè)程序來記錄學(xué)校之中的教師和學(xué)生情況确徙。他們有一些共同屬性,比如姓名执桌、年齡和地址鄙皇。他們也有專有的屬性,比如教師的薪水仰挣、課程和假期伴逸,學(xué)生的成績和學(xué)費(fèi)。你可以為教師和學(xué)生建立兩個(gè)獨(dú)立的類來處理它們膘壶,但是這樣做的話违柏,如果要增加一個(gè)新的共有屬性,就意味著要在這兩個(gè)獨(dú)立的類中都增加這個(gè)屬性香椎。
一個(gè)比較好的方法是創(chuàng)建一個(gè)共同的類稱為SchoolMember, 然后讓教師和學(xué)生的類繼承這個(gè)共同的類禽篱。即它們都是這個(gè)類型(類)的子類型畜伐,然后我們?cè)贋檫@些子類型添加專有的屬性。
使用這種方法有很多優(yōu)點(diǎn)躺率。如果我們?cè)黾?改變了SchoolMember 中的任何功能玛界,它會(huì)自動(dòng)地反映到子類型之中万矾。例如,你要為教師和學(xué)生都增加一個(gè)新的身份證域慎框,那么你只需簡單地把它加到SchoolMember 類中良狈。然而,在一個(gè)子類型之中做的改動(dòng)不會(huì)影響到別的子類型笨枯。另外一個(gè)優(yōu)點(diǎn)是你可以把教師和學(xué)生對(duì)象都作為SchoolMember 對(duì)象來使用薪丁,這在某些場(chǎng)合特別有用,比如統(tǒng)計(jì)學(xué)校成員的人數(shù)馅精。一個(gè)子類型在任何需要父類型的場(chǎng)合可以被替換成父類型严嗜,即對(duì)象可以被視作是父類的實(shí)例,這種現(xiàn)象被稱為多態(tài)現(xiàn)象洲敢。
另外漫玄,我們會(huì)發(fā)現(xiàn)在重用父類的代碼的時(shí)候,我們無需在不同的類中重復(fù)它压彭。而如果我們使用獨(dú)立的類的話睦优,我們就不得不這么做了。
在上述的場(chǎng)合中壮不,SchoolMember 類被稱為基本類或超類汗盘。而Teacher 和Student類被稱為導(dǎo)出類或子類。
class SchoolMember:
'''Represents any school member.'''
def __init__(self, name, age):
self.name = name
self.age = age
print('(Initialized SchoolMember: {})'.format(self.name))
def tell(self):
'''Tell my details.'''
print('Name:"{}" Age:"{}"'.format(self.name, self.age), end=" ")
class Teacher(SchoolMember):
'''Represents a teacher.'''
def __init__(self, name, age, salary):
SchoolMember.__init__(self, name, age)
self.salary = salary
print('(Initialized Teacher: {})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print('Salary: "{:d}"'.format(self.salary))
class Student(SchoolMember):
'''Represents a student.'''
def __init__(self, name, age, marks):
SchoolMember.__init__(self, name, age)
self.marks = marks
print('(Initialized Student: {})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print('Marks: "{:d}"'.format(self.marks))
t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 25, 75)
# prints a blank line
print()
members = [t, s]
for member in members:
# Works for both Teachers and Students
member.tell()
OutPort:
(Initialized SchoolMember: Mrs. Shrividya)
(Initialized Teacher: Mrs. Shrividya)
(Initialized SchoolMember: Swaroop)
(Initialized Student: Swaroop)Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
Name:"Swaroop" Age:"25" Marks: "75"
summary
面向?qū)ο髮?duì)我而言忆畅,理解總是有點(diǎn)問題衡未,這個(gè)在學(xué)習(xí)C#時(shí)就存在,因此花了兩天看完這一章家凯,也算無奈之舉缓醋。即使多花了一天,覺得現(xiàn)在也只是理解了80%绊诲,而不是百分百貫通送粱,要在以后的學(xué)習(xí)中進(jìn)一步鞏固加強(qiáng)。