类是抽象的模板,我们先定义类,然后我们就可以用类这个模板创建出很多对象,比如我们定义一个 Human 类, 然后用 Human 类创建出很多具体的 Human(比如如花,星星,赵日天)等等。
无论是对于如花,星星还是赵日天这些具体的人,他们都有一些共同属性(变量)和行为(函数), 我们可以把这些属性和行为定义在他们所属的 Human 类中。
Python 使用关键字 class 类名
,或者 class 类名()
来定义一个类。
class Human: pass class Human2(): pass print(type(Human)) # <class 'type'> print(type(Human2)) # <class 'type'>
我们定义好了 Human 类,就可以根据 Human 类创建出对象,创建对象是通过类名和小括号来实现。
class Human(): pass luren_a = Human() # 用 Human 类定义一个具体的对象 luren_a print(type(luren_a)) # <class '__main__.Human'>
我们可以用 Human 类定义多个对象,注意每个对象都是独立的个体。
class Human(): pass luren_a = Human() # 用 Human 类定义一个具体的对象 luren_a luren_b = Human() # 用 Human 类定义一个具体的对象 luren_b print(id(luren_a)) print(id(luren_b))
我们可以给 Human 类添加变量(属性),该变量叫做类的成员变量,并且可以通过对象访问到成员变量。
class Human(): name = "ruhua" luren_a = Human() print(luren_a.name) # 通过对象访问对象的属性
我们也可以给 Human 类添加函数(方法),该函数叫做类的成员函数, 但要注意成员函数必须至少有一个参数(我们一般给该参数起名为 self,当然也可以是其它名字), 该参数用来接收调用者本身,调用者本身是 Human 类的一个对象。
class Human(): name = "ruhua" def getname(self): print(id(self)) # self 即是 调用者本身 print(self.name) luren_a = Human() print(id(luren_a)) # 通过 luren_a 对象调用成员函数时,Python 解释器会自动把 luren_a 对象本身作为 getname 的第一个实参。 luren_a.getname()
Python 允许我们动态的给一个对象绑定属性,比如给我们的 Human 类的某个对象动态绑定一个 age 属性。
class Human(): name = "ruhua" luren_a = Human() luren_a.age = 18 print(luren_a.age)
Python 还允许我们动态的给一个对象绑定函数,比如给我们的 Human 类的某个对象动态绑定一个 speak 函数。
class Human(): name = "ruhua" def speak(): print("大家好,我是 ruhua") luren_a = Human() luren_a.speak = speak luren_a.speak()
我们用 Human 类定义好对象后,当给某个对象动态的添加属性和方法时,这些属性和方法并不作用于其它对象。
class Human(): name = "ruhua" def speak(): print("大家好,我是 ruhua") luren_a = Human() luren_b = Human() luren_a.age = 18 luren_a.speak = speak print(luren_a.age) # ok luren_a.speak() # ok print(luren_b.age) # 错误 luren_b.speak() # 错误
如果我们想让动态绑定的属性和方法作用于所有对象,可以直接对类进行动态绑定,比如直接对 Human 类进行动态绑定。
class Human(): name = "ruhua" def speak(self): print("大家好,我是" + self.name) luren_a = Human() luren_b = Human() Human.age = 18 Human.speak = speak print(luren_a.age) # ok luren_a.speak() # ok print(luren_b.age) # ok luren_b.speak() # ok
理解什么是面向对象
弄明白类和对象的区别
知道 Python 的类和对象中增加的额外特性。
著名公司(某讯)笔试题:为什么 Python 在对类进行动态绑定的函数需要有接收对象的参数,而对对象进行绑定的函数不需要这个参数。
class Human(): name = "ruhua" def speak(self): print("大家好,我是" + self.name) def go(): print("我走了两步") luren_a = Human() Human.speak = speak # 类动态绑定函数 speak luren_a.go = go # 对象动态绑定函数 go luren_a.speak() luren_a.go()
因为对象就是本身