首页 > 编程语言 > 详细

Python之面向对象

时间:2019-07-10 23:13:06      阅读:109      评论:0      收藏:0      [点我收藏+]

面向对象的三大特征

  • 封装:
    • 归类,将函数放置到一个类中
    • 打包,将数据打包放到一个对象。  
  • 继承
  • 多态(鸭子模型),由于 Python 传参时,无须指定类型:
    def func(arg): # arg可以是多种类型,只要其中有send方法即可.
        arg.send()

封装

  代码示例:就是将相同的函数归类,然后构造对象进行调用

 1 1. 构造方法
 2 示例一:
 3 class Foo:
 4                             
 5  def __init__(self,name):     构造方法,目的进行数据初始化.
 6    self.name = name 
 7    self.age = 18 
 8                         
 9 obj = Foo(侯明魏)
10                         
11 通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可.
12                     
13 示例二:    
14 class Bar:
15   pass 
16 obj = Bar()
17                     
18 2. 应用
19 a. 将数据封装到对象中,以供自己在方法中调用
20 class FileHandler:
21   def __init__(self,file_path):
22     self.file_path = file_path
23     self.f = open(self.file_path, rb)
24 
25   def read_first(self):
26     # self.f.read()
27     # ...
28        pass
29 
30   def read_last(self):
31     # self.f.read()
32     # ...
33     pass
34 
35   def read_second(self):
36     # self.f...
37     # ...
38     pass
39                             
40 obj = FileHandler(C:/xx/xx.log)
41 obj.read_first()
42 obj.read_last()
43 obj.read_second()
44 obj.f.close()
45                     
46 b. 将数据封装到对象中,以供其他函数调用 
47 def new_func(arg):
48   arg.k1
49   arg.k2
50   arg.k6
51 
52 class Foo:
53   def __init__(self,k1,k2,k6):
54     self.k1 = k1
55     self.k2 = k2
56     self.k6 = k6
57 
58 obj = Foo(111,22,333)
59 new_func(obj)

 面向对象封装的规则:

  1. 归类 + 提取公共值
  2. 在指定类中编写和当前相关类的所有代码 + 提取公共值

继承

  • 父类(基类)
  • 子类(派生类)

  继承支持多继承(先找左 / 在找右)

 1 class SuperBase:
 2     def f3(self):
 3         print(f3)
 4 
 5 class Base(SuperBase):  # 父类,基类
 6     def f2(self):
 7     print(f2)
 8 
 9 class Foo(Base):        # 子类,派生类
10                     
11     def f1(self):
12     print(f1)
13                         
14 obj = Foo()
15 obj.f1()
16 obj.f2()
17 obj.f3()
18 # 原则:现在自己类中找,么有就去父类    

 多态(鸭子模型)

  多种形态或多种状态,可以称作鸭子模型

#  由于python原生支持多态,所以没有特殊性.
"""
class Foo1:
    def f1(self):
    pass 
                
class Foo2:
    def f1(self):
    pass 
                
class Foo3:
    def f1(self):
        pass 
                        
def func(arg):
    arg.f1()
                    
obj = Foo1() # obj= Foo2()   obj = Foo3()
func(obj)
"""        

 

self 中的作用及意义

  self 参数是 Python 给我们自动传递。

  执行方法时,前面必须有一个对象:xxx.func()

class Foo:
    def f1(self):
        pass
                
def f2(self):
    self.f1()
                
obj = Foo()
obj.f2() 

 类中的成员

成员一共分为三类:

  变量:

    - 实例变量(字段)

      - 公有实例变量(字段)

      - 私有实例变量(字段)

class Base(object):
    
    def __init__(self,name):
        self.__name = name # 私有实例变量
        self.age = 10    # 公有实例变量 

    def func(self):
        print(self.__name)

obj = Base(张改熊)
print(obj.name)
# obj.__name # 无法访问
obj.func()        # 找一个内部人:func,让 func 帮助你执行内部私有 __name

 

    - 类变量(静态字段)

      - 公有类变量(静态字段)

      - 私有类变量(静态字段)

class Foo:
    __name = ss
    country = "中国"
    
    def __init__(self):
        pass

    def func(self);
        print(self.country)
        print(Foo.country)
        print(self.__name)
        print(Foo.__name)

# 外部调用,但无法调用私有变量
print(Foo.country)
obj = Foo()
obj.func()
# print(Foo.name)

 

  方法:

    - 实例方法

 1 class Foo(object):
 2     def __init__(self, name):
 3         self.name = name
 4 
 5         # 实例方法
 6     def func(self):
 7         print(self.name)
 8                                 
 9 obj = Foo(..)
10 obj.func()               

 

    - 静态方法

class Foo(object):
    def __init__(self,name):
        self.name = name
    
    # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
    @staticmethod
    def dispalay(a1,a2):
        return a1 + a2

Foo.display(1,3)

 

    - 类方法

1 class Foo(object):
2     
3     # 类方法,cls是类
4     @classmethod
5     def show(cls,x1,x2):
6         print(cls,x1,x2)
7 
8 # 执行类方法
9 Foo.show(1,8)

 

  属性(通过方法改造)

class Foo(object):
    def __init__(self):
        pass

    @property
    def start(self):
        return 1

    @property
    def end(self):
        return 10

obj = Foo()
print(obj.start)
print(obj.end)    

     - 总结:

      1.编写时,

        - 方法上写 @property

        - 方法参数:只有一个self

      2.调用时,无须加括号、对象、方法

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

 

Python之面向对象

原文:https://www.cnblogs.com/guogenyyy/p/11167152.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!