zoukankan      html  css  js  c++  java
  • 4、面向对象

    面向对象简述

    特性:多态、继承、封装

    类成员--> 字段、方法、特性
    字段:普通字段、静态字段
    方法:普通方法、静态方法、类方法
    特性:property,将方法伪造为字段,可以直接使用类.方法名调用,不用加()

    成员修饰符--> 公有和私有 (私有的字段和方法可以通过类对象中的普通方法间接进行调用)
    私有字段:__field, 以__双下划线开头的字段,私有字段只能在自己的对象中才能使用,继承后也无法使用
    私有方法:__function, 以__双下划线开头的方法,私有字段只能在自己的对象中才能使用,继承后也无法使用

    抽象类、抽象方法-->

    1、接口(接口interface是其他语言中的一种特殊的类,此类中的方法只可以写方法名,不写具体的代码实现,对继承此接口的子类中方法进行约束,必须实现接口中规定的方法,python中无interface类)

    2、普通类(继承普通类的子类同时会继承父类的方法)

    3、抽象类(首先抽象类必须继承abc.ABCMeta申明为一个抽象类,类中的方法可以是普通方法,也可以是抽象方法(抽象方法必须使用abc.abstractmethod装饰申明为抽象方法,也只写方法名不用写具体代码实现),子类继承抽象类后,普通方法直接继承,抽象方法必须像接口一样需要子类中去实现)

    特殊类成员
    call
    setitem
    getitem
    delitem
    dict
    iter
    newmetaclass

    __str__和repr__

    默认情况下如果没有定义__str__的情况下__str__ = __repr__ ,实现__repr__目标是准确的,为解释器可读形式,实现__str__是可选的,为人为阅读形式。

    # 定义__repr__和__str__的情况
    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
    >>> p1 = Person('Tony', 23)
    
    >>> print(p1)
    <__main__.Person object at 0x000001F823AFEC88>
    >>> print(p1.__str__())
    <__main__.Person object at 0x000001F823AFEC88>
    >>> print(p1.__repr__())
    <__main__.Person object at 0x000001F823AFEC88>
    
    
    # 定义__repr__的情况
    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def __repr__(self):
            return '(Person: %s, %s)' % (self.name, self.gender)
    
    >>> p1 = Person('Tony', 23)
    
    >>> print(p1)
    (Person: tony, 23)
    >>> print(p1.__str__())
    (Person: tony, 23)
    
    # 定义__repr__和__str__的情况
    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def __repr__(self):
            return '(Person: %s, %s)' % (self.name, self.gender)
        def __str__(self):
            return '(Person: %s, this is custom __str__)' % (self.name)
    
    p1 = Person('tony', 23)
    
    >>>print(p1)
    (Person: tony, this is custom __str__)
    >>>print(p1.__str__())
    (Person: tony, this is custom __str__)
    >>>print(p1.__repr__())
    (Person: tony, 23)
    View Code

    super函数重写基类构造方法

    有一个需求是这样的,先有一个Machine的类,有通用的name、position、date属性,然后又出现了一个Server的类继承Machine类,但是Server类多出一个ipaddr的属性,所以这时就要在Server中重写__init__构造方法,新增一个ipaddr参数,如果想使用父类中已经定义好的方法,就需要使用super执行基类的构造方法把name、position、date三个参数传递给父类。

    class Machine(object):
        def __init__(self, name, position, date):
            self.name = name
            self.position = position
            self.date = date
    
        def getinfo(self):
            return self.name, self.position
    
        def getdate(self):
            return self.date
    
    
    class Server(Machine):
        def __init__(self, name, position, date, ipaddr):
            self.ipaddr = ipaddr
            super(Server, self).__init__(name, position, date) #注意参数个数需要和父类的个数保持一致
    
        def getaddr(self):
            return self.ipaddr
    
    
    s = Server('cnsz003621', 'position1', '2017/02/23', '10.10.2.77')
    r = s.getinfo()
    r2 = s.getaddr()
    print(r, r2)
    View Code
  • 相关阅读:
    给你一个亿-电视节目总结
    给你一个亿-电视节目总结
    我的写作、爱好和好友
    我的写作、爱好和好友
    互联网和移动互联网怎么挣钱?
    互联网和移动互联网怎么挣钱?
    IT人都很忙(茫)
    Java实现 LeetCode 345 反转字符串中的元音字母
    Java实现 蓝桥杯 算法训练 谁干的好事?
    Java实现 蓝桥杯 算法训练 谁干的好事?
  • 原文地址:https://www.cnblogs.com/raykuan/p/6130018.html
Copyright © 2011-2022 走看看