Python基础学习(面对对象)

Python基础学习(面对对象)

三大特性:封装,继承,多态

定义类
class student(object):
	pass
创建实例
a = student()
给一个实例变量绑定属性(随意)
a.name='kagura'
定义类的时候,可以使用初始化函数(构造函数)
class student(object):
	def __init__(self,name,score):
		self.name=name
		self.score=score

至此,创建实例必须要赋初值

访问限制

内部属性不让被外部访问,可以让实例变量名以__开头,变成私有变量。
要从外部 得到/修改 私有变量,需要另外创建函数调用私有变量。

__变量名__  特殊变量,非私有变量,命名规范
_变量名	,外部可以访问,最好不要

__变量名 的私有变量并不一定不能访问,Python解释器会把这个变量换成不同的名字。

注意一种错误写法:
在外部直接调用私有变量并“成功”进行修改,实际上内内部变量并没有改变,这是创建了一个新的变量。

>>>a = student('mea',66')
>>>a.get_name()
'mea'
>>>a.__name = 'aqua'
>>>a.__name
'aqua'
>>>a.get_name()
'mea'
继承和多态

子类可以获得父类的全部方法,并且子类的方法可以重新定义(覆盖掉父类继承的方法)
子类添加新方法也是理所当然的

class animal(object):
	def run(self):
		print('animal is running...')
class dog(animal):
	pass
class cat(animal):
	def run(self):
		print('cat is running...')

判断变量是否是某种类型 isinstance() 可以判断

>>>isinstance(b,dog)
>>>isinstance(b,animal)

子类的类型可以是父类,父类不能是子类

copy:

静态语言 vs 动态语言
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。

对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:

class Timer(object):
    def run(self):
        print('Start...')

这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。

获取对象信息

type() 判断对象的类型,如:int str float

type(abs)				内置函数类型
type(a)					类类型
type(None)			None类型
type(lambda x:x)		匿名函数类型
type((x for x in range(10)))	生成器类型

获取一个对象所有的属性和方法可以使用 dir()函数,返回一个包含字符串的list

类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:

>>> len('ABC')
3
>>> 'ABC'.__len__()
3

配合 getattr() setattr() hasattr()可以操作一个对象的状态。

hasattr(obj,'x')			检测属性'x'是否存在
setattr(obj,'y',19)		设置一个属性 'y'
getattr(obj,'y',404)	获取一个属性,不存在则返回 404
获取对象的方法同理
f = getattr(obj,'power')		获取方法
f()										调用该方法		

一般来说,可以直接用 . 操作符调用属性和方法就优先使用。

copy

一个正确的用法的例子如下:

def readImage(fp):
    if hasattr(fp, 'read'):
        return readData(fp)
    return None

假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。

请注意,在Python这类动态语言中,根据鸭子类型,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。

实例属性和类属性

类本身需要一个属性,可以在定义的时候直接赋值,定义。
创建新实例,默认为类属性,实例可以对自身属性进行更改,不会影响类属性,会屏蔽原来的属性(如果是同名属性),
如果要保留类对实例的影响,最好不要使用相同变量名的属性。

可以使用 del 删除一个实例属性
del s.name

面对对象高级编程之后再学

猜你喜欢

转载自blog.csdn.net/weixin_43420243/article/details/88532067