博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象
阅读量:4971 次
发布时间:2019-06-12

本文共 4790 字,大约阅读时间需要 15 分钟。

面向对象: class

函数编程

def email():    print('发送邮件')def msg():    print('发送短信')def weichat():    print('发送微信')if 1==1:    email()    msg()    weichat()

  面向对象编程

class Message:    def email(self):        print('发送邮件')    def msg(self):        print('发送短信')    def weichat(self):        print('发送微信')if 1 == 1:    obj = Message()    obj.weichat()    obj.msg()    obj.email()

  函数:定义简单/调用简单

       面向对象:缺点定义复杂/调用复杂   优点 归类  将某些类似的函数写在一起

总结:

函数的编程可能会比面向对象好

python中支持两种编程方式

 

面向对象的三大特征

封装   继承    多态

封装:

数据封装和方法封装

相关功能封装到一个类中

将数据封装到一个对象

继承

提高代码的重用性

先在自己类(派生类)中,没有时去父类(基类)中找

python支持多继承

多继承 先找左边

self到底是谁,self是哪个类的对象,那么就从该类开始找

super主动调用其他类的成员

类名.方法名(自己穿self)   与继承无关

super()

多态

多种形态或多种状态

鸭子模型,只要可以嘎嘎叫的就是鸭子

由于python原生态支持多态,所以没有特殊性。但是在Java中必须为要求的形态或形态子类

面向对象的成员

分三类  变量(字段)  方法    属性

变量

实例变量 

静态变量

class Province:    # 静态字段    country = '中国'    def __init__(self, name):        # 普通字段        self.name = name# 直接访问普通字段obj = Province('河北省')print obj.name# 直接访问静态字段Province.country字段的定义和使用

  准则:

实例变量(字段)访问时,使用对象访问。即:obj.name

类变量(静态字段)访问时,使用方法访问,即Foo.country(是在不方便时,才用对象)

 

方法:  实例方法    静态方法   类方法

实例方法:  def  func(self):

静态方法:@staticmethod

如果方法无需使用对象中封装的值,那么就可以使用静态方法

类方法:@classmethod

如果会使用当前类那么就使用类方法

class Foo:    def __init__(self, name):        self.name = name    def ord_func(self):        """ 定义普通方法,至少有一个self参数 """        # print self.name        print '普通方法'    @classmethod    def class_func(cls):        """ 定义类方法,至少有一个cls参数 """        print '类方法'    @staticmethod    def static_func():        """ 定义静态方法 ,无默认参数"""        print '静态方法'# 调用普通方法f = Foo()f.ord_func()# 调用类方法Foo.class_func()# 调用静态方法Foo.static_func()方法的定义和使用

 

属性:通过方法改造出来

编写:方法上方写@property    方法参数:只有一个self

调用:无需加括号   对象.方法

应用场景:对于简单的方法,当无需传参且有返回值时可以使用@property

# ############### 定义 ###############class Foo:    def func(self):        pass    # 定义属性    @property    def prop(self):        pass# ############### 调用 ###############foo_obj = Foo()foo_obj.func()foo_obj.prop   #调用属性属性的定义和使用

修饰符

私有

成员的修饰符为两个下划线

继承中   私有变量在父类(基类)中,子类无法了解获取

公有

默认公有

嵌套(组合)

数据的各种嵌套

 

 特殊方法

class Foo(object):    def __init__(self,a1,a2):        self.a1 = a1        self.a2 = a2        def __call__(self, *args, **kwargs):        print(11111,args,kwargs)        return 123    def __getitem__(self, item):        print(item)        return 8    def __setitem__(self, key, value):        print(key,value,111111111)    def __delitem__(self, key):        print(key)    def __add__(self, other):        return self.a1 + other.a2    def __enter__(self):        print('1111')        return 999    def __exit__(self, exc_type, exc_val, exc_tb):        print('22222')# 1. 类名() 自动执行 __init__# obj = Foo(1,2)# 2. 对象() 自动执行 __call__# ret = obj(6,4,2,k1=456)# 3. 对象['xx']  自动执行 __getitem__# ret = obj['yu']# print(ret)# 4. 对象['xx'] = 11  自动执行 __setitem__# obj['k1'] = 123# 5. del 对象[xx]     自动执行 __delitem__# del obj['uuu']# 6. 对象+对象         自动执行 __add__# obj1 = Foo(1,2)# obj2 = Foo(88,99)# ret = obj2 + obj1# print(ret)# 7. with 对象        自动执行 __enter__ / __exit__# obj = Foo(1,2)# with obj as f:#     print(f)#     print('内部代码')# 8. 真正的构造方法# class Foo(object):#     def __init__(self, a1, a2):     # 初始化方法#         """#         为空对象进行数据初始化#         :param a1:#         :param a2:#         """#         self.a1 = a1#         self.a2 = a2##     def __new__(cls, *args, **kwargs): # 构造方法#         """#         创建一个空对象#         :param args:#         :param kwargs:#         :return:#         """#         return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.).## obj1 = Foo(1,2)# print(obj1)## obj2 = Foo(11,12)# print(obj2)

内置函数

issubclass()

检查第一个参数是第二个参数的子类

class Base(object):    passclass Foo(Base):    passclass Bar(Foo):    passprint(issubclass(Bar,Base)) # 检查第一个参数是否是第二个参数的 子子孙孙类

type

获取当前对象是有哪个类创建

获取对象类

""" 获取当前对象是由那个类创建。""""""class Foo(object):    passobj = Foo()print(obj,type(obj)) # 获取当前对象是由那个类创建。if type(obj) == Foo:    print('obj是Foo类型')"""# #### 练习题"""class Foo(object):    passclass Bar(object):    passdef func(*args):    foo_counter =0    bar_counter =0    for item in args:        if type(item) == Foo:            foo_counter += 1        elif type(item) == Bar:            bar_counter += 1    return foo_counter,bar_counter# result = func(Foo(),Bar(),Foo())# print(result)v1,v2 = func(Foo(),Bar(),Foo())print(v1,v2)"""

isinstance

判断第一个参数(实例)是否是第二个参数(类及父类)的实例

class Base(object):    passclass Foo(Base):    passobj1 = Foo()print(isinstance(obj1,Foo))  # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。print(isinstance(obj1,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。obj2 = Base()print(isinstance(obj2,Foo))  # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。print(isinstance(obj2,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。# #################### 练习"""给你一个参数,判断对象是不是由某一个指定类? type                  --> type(obj) == Foo给你一个参数,判断对象是不是由某一个指定类或其父类? isinstance    --> instance(obj,Foo)"""

  

 

转载于:https://www.cnblogs.com/982336352ryan/p/9544934.html

你可能感兴趣的文章
更新.net core 3.0,dotnet ef命令无法使用的解决办法
查看>>
React躬行记(13)——React Router
查看>>
前端利器躬行记(1)——npm
查看>>
前端利器躬行记(2)——Babel
查看>>
前端利器躬行记(6)——Fiddler
查看>>
Forbidden You don't have permission to access / on this server.
查看>>
Windows server 2008 R2中安装MySQL !
查看>>
Intellij Idea新建web项目(转)
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
linux 命令之top
查看>>
洛谷 [P3033] 牛的障碍
查看>>
centos iptables
查看>>
unity3d 移动与旋转 2
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
20120227_CET6
查看>>