惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
L
LINUX DO - 热门话题
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Cisco Talos Blog
Cisco Talos Blog
AI
AI
L
LINUX DO - 最新话题
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The GitHub Blog
The GitHub Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
S
Securelist
博客园_首页
IT之家
IT之家
Schneier on Security
Schneier on Security
博客园 - 叶小钗
罗磊的独立博客
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
W
WeLiveSecurity
The Register - Security
The Register - Security
D
DataBreaches.Net
S
Security @ Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
Recorded Future
Recorded Future
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tailwind CSS Blog
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
T
Tor Project blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - 西康的博客

mysql information_schema库中COLUMNS 和 TABLES表字段详解 python - queue 队列模块 python - 修改系统环境变量 python - threading 多进程模块 python - socketserver python - 反射 python - socket 基础 python 序列化 字典 异常处理 类的成员,类的特殊方法 elasticsearch RESTfull _cat api python - 面向对象编程基础知识 (进阶) python 文件操作 python re 模块 正则表达式 python configparser 模块 python logging 模块 python hashlib 模块 python sys 模块
python - 面向对象编程基础知识
西康的博客 · 2018-03-30 · via 博客园 - 西康的博客

面向对象三大特性: 封装、继承、多态
  python中默认就支持了多态。所以不用关注多态的知识点。我们主要的知识点就放在封装和继承上,封装和继承是基本的知识。

1、创建简单的类和对象。

  •   比较简单的类和对象调用。
class foo():
    def foo_test(self):
        print ('This is foo.foo_test')
f = foo()
f.foo_test()
# This is foo.foo_test
# 先创建了一个foo类,这个类中只有一个foo_test方法。
# f = foo() 是把foo类实例化成了一个f对象。
# f.foo_test() 是f调用了foo_test方法。这是在执行foo类中的foo_test方法。
  •   向类中的普通方法传递参数
class foo():
    def foo_test(self,arg):
        print (arg)
f = foo()
f.foo_test('test_arg')
# test_arg
# 向foo_test方法传递arg的参数。
  •   搞清楚类中的self是谁
class foo():
    def foo_test(self,arg):
        print (self,arg)

f = foo()
print (f)
f.foo_test('test1')

f2 = foo()
print (f2)
f2.foo_test('rr3r3')

# <__main__.foo object at 0x03894110>
# <__main__.foo object at 0x03894110> test1
# <__main__.foo object at 0x038941F0>
# <__main__.foo object at 0x038941F0> rr3r3
#

    在执行 print (f)的时候,时可以看到f这个对象的内存地址的。当f.foo_test('test1')掉用foo_test时,我们在foo_test函数内也打印self。这时的self内存地址和f这个对象的内存地址一致。所以说明self是调用这个方法的对象。

    同样的在f2这个对象的内存地址也说明了self。实例化的对象,self就是哪个对象。


2、在类中创建方法

  •   构造方法

    构造方法就是当实例化一个对象时,就默认执行的方法。

class foo():
    def __init__(self):
        self.test = 'error'
        print ('internal month')
    def foo_test(self,arg):
        print (self.test)
        print (arg)
f = foo()
f.test = '123'
f.foo_test('arg_')
# internal month
# error
# arg_
# 在实例化foo对象时,这个__init__内部方法是默认执行的。这个init就是构造方法。

    在这例子中,当执行f = foo()时,就会执行foo类中的__init__方法。这个__init__方法就是构造方法。

    其中f.test是通过对象想类中的方法传递参数。

    最后我们调用了foo_test方法,并向他传递了arg_参数。


3、面向对象三大特性 - 封装

  •   使用构造方法封装默认参数
class foo():
    def __init__(self,name,age,gender): # 把初始化时的,name,age,gender都封装到类中。
        self.name = name
        self.age = age
        self.gender = gender

    def show(self,arg):
        print (self.name,self.age,self.gender,arg)

xiaoming = foo('小明','10','')
xiaoming.show('上山去砍柴')
xiaoming.show('开车去东北')
xiaoming.show('最爱大保健')

zhangsan = foo('张三','10','')
zhangsan.show('上山去砍柴')
zhangsan.show('开车去东北')
zhangsan.show('最爱大保健')

# 小明 10 男 上山去砍柴
# 小明 10 男 开车去东北
# 小明 10 男 最爱大保健
# 张三 10 男 上山去砍柴
# 张三 10 男 开车去东北
# 张三 10 男 最爱大保健

    在这个例子中,我们就将name,age,gender这些相同的参数通过构造方法封装到了foo这个类中。所以在之后的show中才能直接调用。

4、面向对象三大特性 - 继承

  •   最简单的继承
class foo():
    def show(self):
        print ('foo.show')
class foo_1(foo):
    def foo_1_show(self):
        print ('foo_1.foo_1_show')
test_obj = foo_1()
test_obj.show()
# foo.show

    foo_1这个类在定义的时候就继承了foo类。所以在执行test_obj.show()方法时,执行了父类中的show方法,因为foo_1这个类中没有show方法。

  •   在子类中执行父类的方法
class foo():
    def show1(self):
        print ('foo.show1')

class foo2(foo):
    def show_1(self):
        super(foo2,self).show1() #有两种调用父类中的方法,推荐用这种方法
    # foo.show1(self) 
        print ('foo2.show1')

test_obj = foo2()
test_obj.show_1()
# foo.show1
# foo2.show1
  •   重写父类中的方法
class foo():
    def show(self):
        print ('foo.show')
class foo_1(foo):
    def foo_1_show(self):
        print ('foo_1.foo_1_show')
    def show(self):
        print ('foo_1.show')
test_obj = foo_1()
test_obj.show()
# foo_1.show

    我们在foo_1定义了与父类相同名称的方法,这时父类的方法就不生效了。就会执行子类中的show方法。

  •   多继承,对象查找方法时的顺序

    首先是当继承了多个父类时,我们要先从左到右的顺序查找。

class f2():
    def show(self):
        print ('f2.show')
class f1(f2):
    def show1(self):
        print ('f1.show')
class ff1():
    def show(self):
        print ('ff1.show')
class sun(f1,ff1):
    pass

obj = sun()
obj.show()
# f2.show

这里说的从左到右的查找顺序是说,在继承的时候class sun(f1,ff1): 。这行代码中f1在ff1左边。

 在说一种情况

在这样的继承中查找方法的顺序应该是,先在f1、f2中查找。如果没有在从ff1中查找,如果ff1中也没有再找最后的根f3。

class f3():
    def show(self):
        print ('f3.show')
class f2(f3):
    def show1(self):
        print ('f2.show')
class f1(f2):
    def show1(self):
        print ('f1.show')
class ff1(f3):
    def show(self):
        print ('ff1.show')
class sun(f1,ff1):
    pass

obj = sun()
obj.show()
# ff1.show