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
原文地址:https://www.cnblogs.com/raykuan/p/6130018.html