zoukankan      html  css  js  c++  java
  • 面向对象(类)

    对象

    什么是对象?

    在Python中一切皆对象!这句话是贯穿我们整个Python编程的核心思想。在面向对象程序设计中,对象基本上可以看做特性以及由一系列可以存取、操作这些数据的方法组成的集合。使用对象替代全局变量和函数的原因可能有很多,其中对象最重要的优点以下几点:

    • 多态
    • 封装
    • 继承

    一、多态

    不同类的对象使用同样的操作,也可以说是同类事物的多种形态

    怎么去理解同种事物的多种形态?如下面的例子:

    1.鸡和猪和狗,三者都是同类的生物,但是却是不同的表现形式

    2.在Python的数据类型中也有很多这样的例子如序列的多种形态有字符串、列表、元祖..

    那么在程序中怎么去体现:

    import abc
    class Animal(metaclass=abc.ABCMeta): #同一类事物:生物
        @abc.abstractmethod
        def talk(self):
            pass
    
    class chicken(Animal): #动物的形态之一:人
        def talk(self):
            print('say hello')
    
    class Dog(Animal): #动物的形态之二:狗
        def talk(self):
            print('say wangwang')
    
    class Pig(Animal): #动物的形态之三:猪
        def talk(self):
            print('say aoao')
    
    
    

    在上述程序中,定义了三个类(鸡、狗和猪),三个类继承一同一个类(生物),即同为一种类-->生物,所以他们都有共同的属性就是都会talk,在上例中我们采用的继承的方式这里也是需要大家明白:一个抽象类有多个子类,因而多态的概念依赖于继承

    二.继承

    继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类,本质的意义是可以减少程序的重复代码

    怎么去解释什么是类,可以将它或多或少地视为种类或者类型的同义词。从很多方面方面来说这就是类———— 一种对象。所有的对象都属于一个类,称为类的实例。

    下面我们先创建一个类:

    class people:   #人类
       
        def walk(self):
            print("%s is walking"%self.name)
        
        def foo(self):
            print("from father %s" %self.name)
    

    上例包含了两个方法定义,现在我们将这个例实例化一个对象:

    class people:
    
        def walk(self,name):
            self.name=name
            print("%s is walking"%self.name)
        def foo(self):
            print("from father %s" %self.name)
    
    t1=people()
    t1.walk("whatmini")
    
    
    "D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
    whatmini is walking
    
    Process finished with exit code 0
    
    
    

    通过上例结果一目了然,应该能说明self的用处了。在调用t1的walking函数时t1会自动将自己作为第一个参数传入函数中————因此命名为self。对于这个变量,每个人可能都会有自己的叫法,但是因为它总是对象自身,所以习惯叫它self。

    同时需要知道的是特性也是可以在外部进行访问的如:

    
    class people:
    
        def walk(self,name):
            self.name=name
            print("%s is walking"%self.name)
        def foo(self):
            print("from father %s" %self.name)
    
    t1=people()
    t1.walk("whatmini")
    print(t1.name)
    
    "D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
    whatmini is walking
    whatmini
    
    Process finished with exit code 0
    
    
    
    • 类的特性、函数和方法

    self 参数事实上正是方法和函数的区别。方法(专业来讲可以称为绑定方法)将他们第一个参数绑定到所属的实例上,因此你无需显示提供该参数。当然也可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数:

    class Class:
        def method(self):
            print("I have a self")
    
    def func():
        print("I don't..")
    
    t1=Class()
    t1.method()
    t1.method=func
    t1.method()
    
    "D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
    I have a self
    I don't..
    
    Process finished with exit code 0
    
    

    需要注意的是,self参数并不依赖于调用方法的方式,可以随意使用其他变量引用同一个方法:

    class Bird:
        song="squaawk!"
        def sing(self):
            print(self.song)
    
    bird=Bird()
    bird.sing()
    birdsong=bird.sing
    birdsong()
    
    "D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
    squaawk!
    squaawk!
    
    Process finished with exit code 0
    
    
    

    尽管最后一方法的调用看起来和函数十分相似,但是变量birdsong引用绑定方法bird.sing上,也就意味着这还是会对self参数进行访问(也就是说它仍旧绑定到类的相同实例上)

    • 实例化(_ init _)

    类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例后的对象定制自己的特性

    class people:
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
        def walk(self):
            print("%s is walking"%self.name)
        def foo(self):
            print("from father %s" %self.name)
    
    t1=people("whatmini",18,"man")
    print(t1.name)
    print(t1.age)
    print(t1.sex)
    
    "D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
    whatmini
    18
    man
    
    Process finished with exit code 0
    
    
    

    上例可以知道init的作用就是对实例化的对象进行初始化作用

  • 相关阅读:
    Search a 2D Matrix leetcode java
    Sqrt(int x) leetcode java
    Search for a Range leetcode java
    php获取客户端公网ip代码
    ddns+ros(routeros)+centos7.6+nginx+php+dnspod
    limits.conf文件修改注意事项,限制文件描述符数和进程数
    阿里云本地存储网关的一些特点和注意事项
    ROS根据访问不同的网址,走不同的路由策略的脚本
    漫威所有电影的 按时间线的观影顺序
    sklearn—特征工程
  • 原文地址:https://www.cnblogs.com/lijian-22huxiaoshan/p/7171892.html
Copyright © 2011-2022 走看看