面向对象简述
特性:多态、继承、封装
类成员--> 字段、方法、特性
字段:普通字段、静态字段
方法:普通方法、静态方法、类方法
特性: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)
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)