《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情




类和对象

阅读:227568919    分享到

类是抽象的模板,我们先定义类,然后我们就可以用类这个模板创建出很多对象,比如我们定义一个 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 的类和对象相对其它语言增加的额外特性

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()

如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论

user_image
15235769395
2021年1月13日 13:53 回复

因为对象就是本身


user_image
Dum大坝
2020年5月23日 04:03 回复

大道至简


user_image
九月田
2020年2月5日 01:01 回复

我见过解释的最好最形象最易懂的类和对象。赞一下!


user_image
freezerush
2019年12月9日 06:19 回复

感谢感谢!!!比看书通俗易懂多了~~~


user_image
Angus
2019年9月3日 06:40 回复

比较通俗易懂。而且喂什么要用类这点很重要,我刚开始不理解,就不明白有什么好处


user_image
李元华
2019年8月29日 14:24 回复

兄弟你太牛了,我想给你打赏


user_image
大蚂蚁
2019年1月16日 16:18 回复

刚好学到这里,写得太棒了