-
调用父类的方法用super()
查看全部 -
fqgqe ef
查看全部 -
类的特性:
封装性
继承
多态
查看全部 -
函数和方法最大的区别在于:
函数仅仅是一段供人调用代码串,处于游离状态:
而方法,是依附于某个类中,供其他程序调用
查看全部 -
设置对象属性:通常不必定义,调用从父类继承的方法
def __setattr__(self, name, value): self.__dict__[name] = value
查询对象属性:
__getattr__(self, name):访问属性在默认情况下没有被查询到的情况下调用
__getattribute__(self, name):每次访问属性一定会调用,容易引起无限递归,最好调用父类的getattribute
删除对象属性
__delattr__(self, name)
class Programer(object): def __init__(self, name, age): self.name = name self.age = age def __getattribute__(self, name): return super(Programer, self).__getattribute__(name) def __setattr__(self, name, value): self.__dict__[name] = value if __name__ = '__main__': p = Programer('Albert', 25) print n.name
查看全部 -
在print的过程中,将对象转换为字符串,包括三种方法:
__str__:转换成适合人看的字符串
__repr__:转换成适合机器看的字符串
__unicode__
展现对象属性:__dir__
class Programer(object): def __init__(self, name, age): self.name = name if isinstance(age, int): self.age = age else: raise Exception('age must be int') def __str__(self): return '%s is %s years old' % (self.name, self.age) def __dir__(self): return self.__dict__.keys() if __name__ = '__main__': p = Programer('Albert', 25) print p print dir(p)
查看全部 -
比较运算符
__cmp__(self, other):包括以下所有比较情况
__eq__(self, other):判断等于情况
__lt__(self, other):判断小于情况
__gt__(self, other):判断大于情况
数字运算符
__add__(self, other):加
__sub__(self, other):减
__mul__(self, other):乘
__div__(self, other):除
逻辑运算符
__or__(self, other):或
__and__(self, other):与
class Programer(object): def __init__(self, name, age): self.name = name if isinstance(age, int): self.age = age else: raise Exception('age must be int') def __eq__(self, other): if isinstance(other, Programer): if self.age == other.age: return True else: return False else: raise Exception('the type of object must be Programer') def __add__(self, other): if isinstance(other, Programer): return self.age + other.age else: raise Exception('the type of object must be Programer')
查看全部 -
构造对象的过程:
首先调用__new__方法创建类的对象:def __new__(cls),通常不必定义(继承父类,父类会创建类对象),返回一个类的初始对象
将返回的对象交给__init__,对属性进行设置:def __init__(self)
class Programer(object): def __new__(cls, *args, **kwargs): #改写new方法 print 'call __new__ method' print args return super(Programer, self).__new__(cls, *args, **kwargs) def __init__(self, name, age): print 'call __init__ method' self.name = name self.age = age if __name__ = '__main__': programer = Programer('Albert', 25) print programer.__dict__
查看全部 -
多态的要素:
继承
方法重写
class Programer(object): hobby = 'Play Computer' def __init__(self, name, age, weight): self.name = name self._age = age self.__weight = weight def self_introduction(self): print 'My name is %s \nI am %s years old\n' % (self.name, self._age) class BackendProgramer(Programer): def __init__(self, name, age, weight, language): super(BackendProgramer, self).__init__(name, age, weight) self.language = language def self_introduction(self): print 'My name is %s \nMy favorite language is %s' % (self.name, self.language) def introduce(programer): if isinstance(programer, Programer): programer.self_introduction() if __name__ == '__main__': programer = Programer('Albert', 25, 80) backend_programer = BackendProgramer('Tim', 30, 70, 'Python') introduce(programer) introduce(backend_programer)
查看全部 -
继承使得大量代码被复用,是面向对象的优势。
Object类是一切类的父类。
继承的子类会继承父类的属性和方法,也可以自己定义,覆盖父类的属性和方法。
在重写父类时,需要调用父类里的方法-->super()
class A(object): def method(self, arg): pass class B(A): def method(self, arg): super(B, self).method(arg)
子类的类型判断:
isinstance:判断类型
issubclass:判断是否是子类
class Programer(object): hobby = 'Play Computer' def __init__(self, name, age, weight): self.name = name self._age = age self.__weight = weight def self_introduction(self): print 'My name is %s \nI am %s years old\n' % (self.name, self._age) class BackendProgramer(Programer): def __init__(self, name, age, weight, language): super(BackendProgramer, self).__init__(name, age, weight) self.language = language if __name__ == '__main__': programer = BackendProgramer('Albert', 25, 80, 'Python') print dir(programer) print programer.__dict__ print type(programer) #-->属于BackendProgramer print isinstance(programer, Programer) #-->True
查看全部 -
函数与方法的区别:
函数:直接调用函数名的方式
方法:必须与对象结合使用,依附于类
类的方法可以看做类的属性,也没有访问控制(与类的属性一致)。
两个装饰器:
@classmethod,类似直接在类里定义属性,调用时用类名,而不是某个对象
@property,原调用方法:对象名.方法名(),现调用方法:像访问属性一样调用方法
class Programer(object): hobby = 'Play Computer' def __init__(self, name, age, weight): self.name = name self._age = age self.__weight = weight @classmethod def get_hobby(cls): return cls.hobby @property def get_weight(self): return self.__weight def self_introduction(self): print 'My name is %s \nI am %s years old\n' % (self.name, self._age) if __name__ == '__main__': programer = Programer('Albert', 25, 80) print dir(programer) print Programer.get_hobby() #用类名Programer调用 print programer.get_weight #像访问属性一样,不用加括号 programer.self_introduction()
查看全部 -
定义类的属性:
在类里定义,类里所有对象共享该属性
在构造函数里定义,在构造对象时将属性值传入
没有访问控制(JAVA:Public&Private),没有提供私有属性的功能
class Programer(object): hobby = 'Play Computer' def __init__(self, name, age, weight): self.name = name #无下划线-->可以公开访问 self._age = age #有一个下划线-->私有属性,仍可访问 self.__weight = weight #两个下划线-->部分私有属性,需要改变属性名访问 def get_weight(self): #定义获取weight属性的方法 return self.__weight if __name__ == '__main__': programer = Programer('Albert', 25, 80) #对象实例化 print dir(programer) print programer.__dict__ #从构造函数里获得的属性 print programer.get_weight() print programer._Programer__weight #“对象名._类名__属性名”的方法访问
查看全部 -
定义类
class ClassName: def __init__(self, [……) #构造函数:设置类的属性 pass def __del__(self, [……) #析构函数:销毁对象时调用 pass
旧式类:
class OldStyle: pass
新式类:(在python2中,若一个类没有继承别的类,最好继承object类;在python3中,所有类皆是新式类)
class NewStyle(object): pass
类的内建函数:
dir():返回对象的属性
type():获取对象的类型
查看全部 -
面向对象的两个基本概念:
类:定义了一件事物的抽象特点,例如现实生活中的某个群体
对象:类的实例,例如某个群体中的个体
面向对象的基本要素:
属性(变量),例如某个群体的信息:年龄、性别、身高
方法(函数),例如某个群体的功能:写代码、修电脑
面向对象的特性:
封装性:对外暴露了功能,隐藏了具体的实现细节
继承:对庞大群体进行细微分类,子类继承父类的属性和方法,分为单继承与多重继承,例如前端程序员、后端程序员
多态:由同一个类继承的几个类,在调用同一个方法时,会有不同的反应,例如同一类群体对同一件事有不同的看法
查看全部 -
比较运算符:
__cmp__(self,other)、__eq__(self,other) 、__lt__(self,other) 、__gt__(self,other)
数字运算符:
__add__(self,other) 、 __sub__(self,other) 、 __mul__(self,other) 、 __div__(self,other)
逻辑运算符:
__or__(self,other) 、 __and__(self,other)
查看全部
举报