python可以实现面向过程式编程,也可以实现面向对象式编程OOP。
面向对象编程OOP
面向对象的核心概念
类是抽象的,实例或者对象是具体的。
面向对象的程序设计方法:
一个对象里面可以存放其他多个对象.
任何对象都是类的实例。
对象的接口
类:将同一种具体事物的共同特性抽象出来的表现。
状态和转换这些转台的操作
数据:
变量:就是属性
方法:
函数:操作变量引用的数据代码。
一个类里面的方法只有通过构建类的实例或者类的对象来被操作,这就叫做方法的绑定。
类间的关系
依赖:列表依赖于字串,数字等不同的类。
包含:列表类的对象中包含字符串,数字等类的对象。
继承:只要父类所拥有的,子类都能够继承。反过来则不一定。
面向对象编程的原则:
1.封装
2.继承
3.多态
多态的表现如下:自动判断调用哪种方法。
python 类和实例
python3
python2
python2:
python3:
class class_name
类是一个对象。
类实例化出来的实例也是对象,即实例的对象。
因此类包含了2种对象,类对象和实例对象。世界上所有有的东西都应该找一个地方存起来,即占用一个地方。因此类对象就是存储类的地方。实例化出来的东西存放一个地方叫做实例对象。
通过对类对象的调用就能够实例化出来实例的
python 中创建类
class ClassName(bases):
data=value #类属性 没有实例化对象时就可以存在它的值
def method(self,…):
self.member=value #带有self的属性是实例属性。只有实例化出来来时才会存在。
例子:
接上图:
如果要创建某个实例的不同数据:
接上图:
python类方法及调用 (重点)
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是self.
python类和实例属性
python 构造器 : init(self)方法
class MyClass(object):
def init(self,x,y…):
self.arg1=x
self.arg2=y
class后面紧接着是类名,即People,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的.
object是所有类的父类,不写便是默认object.
有了__init__(self)的方法后,创建实例的时候,传入参数便不能为空,必须传入与__init__(self)中方法匹配的参数个数。
而self代表的是类的实例,该参数不需要另外进行传入
varname():在使用到时会被python解释器自动调用的
a+b=a.add()(b)
list1=[1,2,3,4,]
自创建这个列表对象的时候会自动调用list类里面的__init__()方法的。
# 下面的代码说明如果在函数中定义了__init__(self)方法,但没有给self参数,那么这个类的实例化对象是创建不出来的。只有有了self参数,才能实例化对象,即使__init__(self)函数中没有其他参数不执行任何内容。但是如果不写__ini__(self),则其他的函数就不一定要有self参数。
>>> class MyClass():
... data="xiaopang"
... def __init__(self,x):
... self.name=x
...
>>> mc=MyClass("xiaopang")
>>> print(mc.name)
xiaopang
>>> mc.data
'xiaopang'
>>> mc1=MyClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'x'
>>> class MyClass():
... data="xiaopang"
... def __init__():
... pass
... def x(self,y):
... self.name=y
...
>>> mc=MyClass("xiaopang")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes 0 positional arguments but 2 were given
>>> class MyClass():
... data="xiaopang"
... def __init__():
... pass
...
>>> mc=MyClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes 0 positional arguments but 1 was given
>>> class MyClass():
... data="xiaopang"
... def __init__(self):
... pass
... def x(self,x):
... self.s= x
...
>>> mc=MyClass()
>>> mc.x("xiaohe")
>>> mc.s
'xiaohe'
>>> mc=MyClass("xiaohe")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes 1 positional argument but 2 were given
>>>
析构器__del__(self)
del(self)是析构器,当Python对象的所有引用都不存在了(被del了),就会自动触发__del__(self)执行。
一般而言析构函数都无需重载的,解析器会自动销毁的。
类的特殊属性
代码实例如下:
>>> class MyClass():
... data="xiapang"
... def __init__(self,x):
... self.name=x
... def qin(self,a,b,c,d):
... self.e=a
... self.f=b
... self.g=c
... self.h=d
...
>>> mc=MyClass("xiaohe")
>>> mc.name
'xiaohe'
>>> mc.qin("like","with","and","missing")
>>> mc.e
'like'
>>> mc.f
'with'
>>> mc.g
'and'
>>> mc.h
'missing'
>>> MyClass.__dict__
mappingproxy({'__module__': '__main__', 'data': 'xiapang', '__init__': <function MyClass.__init__ at
0x0000000002F5CAE8>, 'qin': <function MyClass.qin at 0x0000000002FC21E0>, '__dict__': <attribute '_
_dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__do
c__': None})
>>> MyClass.__name__
'MyClass'
>>> MyClass.__doc__
>>> MyClass.__bases__
(<class 'object'>,)
>>> MyClass__module__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'MyClass__module__' is not defined
>>> MyClass.__module__
'__main__'
>>> MyClass.__class__
<class 'type'>
实例属性
#截取的部分代码:
mc代表类实例化出来的对象。
Python2:
可用变量
类变量:也叫做静态变量。
局部变量:方法内部的变量
实例变量: self.变量名。
全局变量:直接使用
对类变量进行修改可能会修改对应实例的属性值,但是如果在修改之前某个类实例已经重新对类属性进行赋值,则类对象对类变量的属性修改不影响那个已经重新赋值的实例属性,其他没有重新赋值的类的实例对象的属性值则会随着类变量的重新复制而改变。
完结
下一篇 类的继承和属性模型搜索